Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL에서 이번 달 레코드 합산하는 방법 완벽 가이드

MySQL에서 이번 달 레코드를 합산하는 방법

MySQL에서 현재 월에 해당하는 레코드의 값을 합산하려면 SUM() 함수와 MONTH() 함수를 함께 사용하면 됩니다. 이번 글에서는 실제 예제를 통해 단계별로 자세히 알아보겠습니다.

1단계: 테이블 생성하기

먼저 예제에 사용할 테이블을 생성합니다. 납기일(DueDate)과 금액(Amount) 두 개의 컬럼을 가진 테이블입니다.

mysql> create table DemoTable1889
    (
    DueDate date,
    Amount int
    );
Query OK, 0 rows affected (0.00 sec)

2단계: 샘플 데이터 삽입하기

INSERT 명령을 사용하여 여러 날짜와 금액 데이터를 입력합니다. 연도가 서로 다른 12월 데이터도 포함시켜서 MONTH() 함수의 동작 방식을 확인할 수 있도록 했습니다.

mysql> insert into DemoTable1889 values('2019-12-11',500);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1889 values('2019-11-11',1000);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1889 values('2018-12-04',700);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1889 values('2017-12-10',300);
Query OK, 1 row affected (0.00 sec)

3단계: 전체 레코드 조회하기

SELECT 문으로 테이블에 저장된 모든 데이터를 확인해 보겠습니다.

mysql> select * from DemoTable1889;

위 쿼리는 다음과 같은 결과를 출력합니다.

+------------+--------+
| DueDate    | Amount |
+------------+--------+
| 2019-12-11 |    500 |
| 2019-11-11 |   1000 |
| 2018-12-04 |    700 |
| 2017-12-10 |    300 |
+------------+--------+
4 rows in set (0.00 sec)

4단계: 현재 날짜 확인하기

CURDATE() 함수를 사용하여 현재 시스템 날짜를 먼저 확인합니다. 이 예제에서 현재 날짜는 2019년 12월 10일입니다.

mysql> select curdate();
+------------+
| curdate()  |
+------------+
| 2019-12-10 |
+------------+
1 row in set (0.00 sec)

5단계: 이번 달 레코드 합산 쿼리 실행하기

이제 핵심 쿼리입니다. WHERE 절에서 MONTH(DueDate) = MONTH(CURDATE()) 조건을 사용하여 납기일의 월이 현재 월과 일치하는 레코드만 필터링한 후, SUM() 함수로 금액을 합산합니다.

mysql> select sum(Amount) from DemoTable1889 where MONTH(DueDate)=MONTH(curdate());

실행 결과는 다음과 같습니다.

+-------------+
| sum(Amount) |
+-------------+
|        1500 |
+-------------+
1 row in set (0.00 sec)

결과 분석 및 주의사항

결과값 1500은 2019-12-11(500), 2018-12-04(700), 2017-12-10(300) 세 레코드의 합계입니다. 즉, MONTH() 함수는 연도와 상관없이 월 숫자만 비교하기 때문에 과거 연도의 12월 데이터까지 모두 포함됩니다.

만약 현재 연도의 이번 달 데이터만 정확하게 집계하고 싶다면, YEAR() 조건을 추가하여 아래와 같이 작성하는 것이 좋습니다.

mysql> select sum(Amount) from DemoTable1889
    where MONTH(DueDate)=MONTH(curdate())
      and YEAR(DueDate)=YEAR(curdate());

또한 인덱스 활용 측면에서는 컬럼에 함수를 적용하면 인덱스를 사용할 수 없게 되므로, 대용량 테이블에서는 날짜 범위 조건(예: DueDate >= '2019-12-01' AND DueDate < '2020-01-01')을 사용하는 방식이 성능 면에서 더 유리합니다.