개요
날짜(Date) 컬럼에서 월(Month) 정보를 추출해 별도의 컬럼처럼 표시하고, 중복되는 월에 해당하는 값들의 합계를 구하고 싶다면 MySQL의 DATE_FORMAT() 함수를 활용할 수 있습니다. 이번 글에서는 예제 테이블을 직접 만들어 보고, GROUP BY 절과 함께 DATE_FORMAT()을 사용해 월별 합계를 구하는 과정을 단계별로 살펴보겠습니다.
1. 테이블 생성하기
먼저 CREATE TABLE 문을 사용하여 데모 테이블을 생성합니다.
mysql> create table DemoTable
-> (
-> PurchaseDate date,
-> Amount int
-> );
Query OK, 0 rows affected (0.52 sec)
2. 레코드 삽입하기
INSERT 명령어를 사용하여 테이블에 여러 개의 레코드를 추가합니다. 이때 의도적으로 같은 날짜(2018-10-12)를 두 번 넣어 중복 데이터 상황을 만들어 보겠습니다.
mysql> insert into DemoTable values('2019-10-12',500);
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable values('2018-10-12',1000);
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable values('2019-01-10',600);
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable values('2018-10-12',600);
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable values('2018-11-10',800);
Query OK, 1 row affected (0.18 sec)3. 전체 레코드 조회하기
SELECT 문을 사용하여 테이블에 저장된 모든 레코드를 확인합니다.
mysql> select *from DemoTable;
실행 결과는 다음과 같습니다.
+--------------+--------+
| PurchaseDate | Amount |
+--------------+--------+
| 2019-10-12 | 500 |
| 2018-10-12 | 1000 |
| 2019-01-10 | 600 |
| 2018-10-12 | 600 |
| 2018-11-10 | 800 |
+--------------+--------+
5 rows in set (0.00 sec)
4. 월별 합계를 구하는 쿼리 작성하기
아래는 날짜에서 월 컬럼을 새로 만들고, 중복되는 날짜가 있는 월의 Amount 합계를 함께 표시하는 쿼리입니다.
mysql> select sum(Amount) as Amount,date_format(PurchaseDate,'%b') AS Month from DemoTable
-> group by date_format(PurchaseDate,'%Y-%m');
실행 결과는 다음과 같습니다.
+--------+-------+
| Amount | Month |
+--------+-------+
| 500 | Oct |
| 1600 | Oct |
| 600 | Jan |
| 800 | Nov |
+--------+-------+
4 rows in set (0.00 sec)
쿼리 동작 방식 살펴보기
위 쿼리가 어떻게 동작하는지 핵심 요소별로 정리하면 다음과 같습니다.
- date_format(PurchaseDate, '%b') : 날짜 값에서 월 이름을 축약형(예: Oct, Jan, Nov)으로 추출하여 'Month'라는 별칭으로 표시합니다.
- group by date_format(PurchaseDate, '%Y-%m') : 연도와 월을 함께 기준으로 그룹화합니다. 연도까지 포함하는 이유는 2018년 10월과 2019년 10월처럼 서로 다른 해의 같은 월이 하나로 잘못 합쳐지는 것을 방지하기 위해서입니다.
- sum(Amount) : 같은 연월에 속한 여러 레코드의 Amount 값을 합산합니다. 예제에서 2018-10-12 날짜가 두 번 등장했기 때문에 해당 월의 합계는 1000 + 600 = 1600으로 계산됩니다.
결과적으로 원본 5개의 레코드가 4개의 월 단위 행으로 그룹화되어 출력되며, 중복된 날짜가 존재하는 월의 금액은 자동으로 합산되어 표시됩니다. 이처럼 DATE_FORMAT()과 GROUP BY를 조합하면 일별 거래 데이터를 손쉽게 월별 매출 통계로 변환할 수 있어 실무 리포트 작성에 매우 유용합니다.