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')을 사용하는 방식이 성능 면에서 더 유리합니다.