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

MySQL에서 월과 연도 기준으로 데이터 그룹화하는 방법

MySQL에서 날짜 데이터를 월(month)과 연도(year) 단위로 그룹화하려면 DATE_FORMAT() 함수와 GROUP BY 절을 함께 사용하면 됩니다. 이 조합은 매출 집계, 통계 리포트 등 날짜별 데이터를 정리할 때 매우 유용하게 활용됩니다.

기본 문법

월과 연도를 그룹화하는 기본적인 쿼리 구조는 다음과 같습니다.

SELECT DATE_FORMAT(yourColumnName, '%m-%Y') FROM yourTableName
GROUP BY MONTH(yourColumnName), YEAR(yourColumnName) DESC;
  • DATE_FORMAT(컬럼명, '%m-%Y') : 날짜를 '월-연도' 형식의 문자열로 변환합니다.
  • GROUP BY MONTH(), YEAR() : 월과 연도를 기준으로 레코드를 묶습니다.
  • DESC : 최신 연도부터 내림차순으로 정렬합니다.

예제 테이블 생성하기

개념을 이해하기 위해 먼저 테스트용 테이블을 만들어 보겠습니다. 아래는 테이블 생성 쿼리입니다.

mysql> create table GroupMonthAndYearDemo
-> (
-> DueDate datetime
-> );
Query OK, 0 rows affected (1.49 sec)

샘플 데이터 삽입

다음 쿼리로 현재 시점을 기준으로 연도가 다른 여러 날짜 데이터를 삽입합니다.

mysql> insert into GroupMonthAndYearDemo values(now());
Query OK, 1 row affected (0.11 sec)

mysql> insert into GroupMonthAndYearDemo values(date_add(now(),interval 2 year));
Query OK, 1 row affected (0.12 sec)

mysql> insert into GroupMonthAndYearDemo values(date_add(now(),interval -2 year));
Query OK, 1 row affected (0.10 sec)

mysql> insert into GroupMonthAndYearDemo values(date_add(now(),interval 1 year));
Query OK, 1 row affected (0.16 sec)

mysql> insert into GroupMonthAndYearDemo values(date_add(now(),interval -1 year));
Query OK, 1 row affected (0.14 sec)

date_add(now(), interval N year) 함수를 사용하면 현재 날짜에서 지정한 연도만큼 더하거나 뺀 값을 손쉽게 만들 수 있습니다.

저장된 데이터 확인

SELECT 문으로 테이블의 전체 레코드를 조회해 보겠습니다.

mysql> select *from GroupMonthAndYearDemo;

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

+---------------------+
| DueDate |
+---------------------+
| 2018-12-06 13:12:34 |
| 2020-12-06 13:12:59 |
| 2016-12-06 13:13:08 |
| 2019-12-06 13:13:14 |
| 2017-12-06 13:13:19 |
+---------------------+
5 rows in set (0.00 sec)

월과 연도 기준으로 그룹화하는 쿼리

이제 DATE_FORMAT()GROUP BY를 사용해 월과 연도별로 데이터를 묶어 보겠습니다.

mysql> select DATE_FORMAT(DueDate, '%m-%Y') from GroupMonthAndYearDemo
-> GROUP BY MONTH(DueDate), YEAR(DueDate) DESC;

실행 결과, 월과 연도가 내림차순으로 그룹화되어 출력됩니다.

+-------------------------------+
| DATE_FORMAT(DueDate, '%m-%Y') |
+-------------------------------+
| 12-2020 |
| 12-2019 |
| 12-2018 |
| 12-2017 |
| 12-2016 |
+-------------------------------+
5 rows in set, 2 warnings (0.00 sec)

정리 및 참고 사항

이처럼 MySQL에서는 DATE_FORMAT() 함수로 원하는 날짜 형식을 지정하고, GROUP BY 절에 MONTH()YEAR() 함수를 넣어 간단히 월·연도 단위 집계를 할 수 있습니다.

추가로 알아두면 좋은 팁은 다음과 같습니다.

  • 형식 변경 : '%Y-%m'으로 지정하면 '2020-12'처럼 연도가 앞에 오는 형식으로 출력할 수 있어 정렬 가독성이 더 좋아집니다.
  • 경고(warnings) 무시 : 결과에 '2 warnings'가 표시될 수 있는데, 이는 GROUP BY 절의 정렬 방식과 관련된 것으로 대부분 무시해도 됩니다. 필요하다면 ORDER BY 절을 별도로 사용해 정렬을 명시하는 것이 좋습니다.
  • 집계 함수 활용 : 실무에서는 COUNT(*), SUM() 같은 집계 함수를 함께 사용해 월별 건수나 합계를 구하는 경우가 많습니다.