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

MySQL DATE_FORMAT()으로 날짜에서 월 컬럼을 만들고 중복 월의 합계를 표시하는 방법


개요

날짜(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를 조합하면 일별 거래 데이터를 손쉽게 월별 매출 통계로 변환할 수 있어 실무 리포트 작성에 매우 유용합니다.