MySQL에서 날짜 데이터를 월 단위로 그룹화하여 합계를 구하려면 GROUP BY MONTH() 절을 활용하면 됩니다. 이 글에서는 예제 테이블을 만들고, 월별로 금액 합계를 집계하는 전체 과정을 단계별로 살펴보겠습니다.
1. 예제 테이블 생성
먼저 구매 날짜와 금액을 저장할 테이블을 생성합니다.
mysql> create table DemoTable1628
-> (
-> PurchaseDate date,
-> Amount int
-> );
Query OK, 0 rows affected (1.55 sec)
2. 샘플 데이터 삽입
INSERT 명령을 사용해 테이블에 여러 개의 레코드를 추가합니다.
mysql> insert into DemoTable1628 values('2019-01-10',1500);
Query OK, 1 row affected (0.68 sec)
mysql> insert into DemoTable1628 values('2019-10-10',2000);
Query OK, 1 row affected (0.61 sec)
mysql> insert into DemoTable1628 values('2019-10-24',100);
Query OK, 1 row affected (0.20 sec)
mysql> insert into DemoTable1628 values('2019-11-10',500);
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable1628 values('2019-12-10',1600);
Query OK, 1 row affected (0.32 sec)
mysql> insert into DemoTable1628 values('2019-10-10',900);
Query OK, 1 row affected (0.47 sec)3. 전체 레코드 확인
SELECT 문으로 테이블의 모든 데이터를 조회해 보겠습니다.
mysql> select * from DemoTable1628;
위 쿼리는 다음과 같은 결과를 출력합니다.
+--------------+--------+
| PurchaseDate | Amount |
+--------------+--------+
| 2019-01-10 | 1500 |
| 2019-10-10 | 2000 |
| 2019-10-24 | 100 |
| 2019-11-10 | 500 |
| 2019-12-10 | 1600 |
| 2019-10-10 | 900 |
+--------------+--------+
6 rows in set (0.00 sec)
4. 월별 합계 조회 쿼리
이제 MONTH() 함수로 월을 추출하고 GROUP BY로 그룹화한 뒤, SUM() 함수로 금액 합계를 구하는 쿼리입니다. YEAR() 함수를 함께 사용하면 연도 정보도 함께 확인할 수 있어 더욱 유용합니다.
mysql> select month(PurchaseDate) as Month,year(PurchaseDate) as Year,SUM(Amount)
-> from DemoTable1628
-> group by month(PurchaseDate);
위 쿼리는 다음과 같은 결과를 출력합니다.
+-------+------+-------------+
| Month | Year | SUM(Amount) |
+-------+------+-------------+
| 1 | 2019 | 1500 |
| 10 | 2019 | 3000 |
| 11 | 2019 | 500 |
| 12 | 2019 | 1600 |
+-------+------+-------------+
4 rows in set (0.20 sec)
결과 분석 및 참고 사항
실행 결과를 보면 10월의 경우 두 건(2,000원과 100원, 그리고 900원)이 하나의 그룹으로 묶여 합계 3,000으로 집계된 것을 확인할 수 있습니다.
다만 한 가지 주의할 점이 있습니다. 위 쿼리는 월(month)만 기준으로 그룹화하기 때문에, 서로 다른 연도의 같은 월(예: 2018년 10월과 2019년 10월)이 하나로 합쳐질 수 있습니다. 여러 해의 데이터가 섞여 있는 테이블이라면 아래처럼 연도까지 함께 그룹화하는 것이 안전합니다.
select year(PurchaseDate) as Year, month(PurchaseDate) as Month, SUM(Amount)
from DemoTable1628
group by year(PurchaseDate), month(PurchaseDate);
이렇게 하면 연도와 월을 모두 기준으로 정확하게 월별 합계를 집계할 수 있습니다.