MySQL에서 데이터를 월별로 그룹화하고 집계하려면 SUM() 같은 집계 함수와 GROUP BY 절을 함께 사용하면 됩니다. 이 글에서는 구매 날짜(PurchaseDate)를 기준으로 월별 레코드를 선택하고 가격 합계를 구하는 방법을 단계별로 살펴보겠습니다.
1. 테이블 생성하기
먼저 예제에 사용할 테이블을 생성합니다. 아래 쿼리는 상품 가격과 구매 날짜를 저장하는 테이블을 만드는 코드입니다.
mysql> create table SelectPerMonthDemo
-> (
-> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> Price int,
-> PurchaseDate datetime
-> );
Query OK, 0 rows affected (2.34 sec)2. 샘플 데이터 삽입하기
INSERT 명령어를 사용해 여러 개의 레코드를 추가합니다. 구매 날짜는 date_add() 함수를 활용해 현재 시점을 기준으로 다양한 월의 데이터가 들어가도록 설정했습니다.
mysql> insert into SelectPerMonthDemo(Price,PurchaseDate) values(600,date_add(now(), interval -1 month)); Query OK, 1 row affected (0.42 sec) mysql> insert into SelectPerMonthDemo(Price,PurchaseDate) values(600,date_add(now(), interval 2 month)); Query OK, 1 row affected (0.34 sec) mysql> insert into SelectPerMonthDemo(Price,PurchaseDate) values(400,now()); Query OK, 1 row affected (0.20 sec) mysql> insert into SelectPerMonthDemo(Price,PurchaseDate) values(800,date_add(now(), interval 3 month)); Query OK, 1 row affected (0.13 sec) mysql> insert into SelectPerMonthDemo(Price,PurchaseDate) values(900,date_add(now(), interval 4 month)); Query OK, 1 row affected (0.10 sec) mysql> insert into SelectPerMonthDemo(Price,PurchaseDate) values(100,date_add(now(), interval 4 month)); Query OK, 1 row affected (0.22 sec) mysql> insert into SelectPerMonthDemo(Price,PurchaseDate) values(1200,date_add(now(), interval -1 month)); Query OK, 1 row affected (0.09 sec)
3. 전체 레코드 확인하기
SELECT 문으로 테이블에 저장된 모든 레코드를 조회합니다.
mysql> select *from SelectPerMonthDemo;
출력 결과
아래 결과에서 각 상품의 가격과 구매 날짜를 확인할 수 있습니다.
+----+-------+---------------------+ | Id | Price | PurchaseDate | +----+-------+---------------------+ | 1 | 600 | 2019-01-10 22:39:30 | | 2 | 600 | 2019-04-10 22:39:47 | | 3 | 400 | 2019-02-10 22:40:03 | | 4 | 800 | 2019-05-10 22:40:18 | | 5 | 900 | 2019-06-10 22:40:29 | | 6 | 100 | 2019-06-10 22:40:41 | | 7 | 1200 | 2019-01-10 22:40:50 | +----+-------+---------------------+ 7 rows in set (0.00 sec)
4. 월 이름(Month Name) 기준으로 그룹화하기
구매 날짜를 기준으로 각 월별 레코드를 집계하려면 monthname() 함수와 GROUP BY 절을 사용합니다. 아래 쿼리는 월 이름별로 가격의 합계를 반환합니다.
mysql> select monthname(PurchaseDate) as MONTHNAME,sum(Price) from SelectPerMonthDemo -> group by monthname(PurchaseDate);
출력 결과
+-----------+------------+ | MONTHNAME | sum(Price) | +-----------+------------+ | January | 1800 | | April | 600 | | February | 400 | | May | 800 | | June | 1000 | +-----------+------------+ 5 rows in set (0.07 sec)
결과를 보면 1월(January)에는 총 1800, 6월(June)에는 총 1000의 가격 합계가 집계된 것을 확인할 수 있습니다.
5. 월 번호(Month Number) 기준으로 그룹화하기
월 이름 대신 월 번호만 필요한 경우라면 month() 함수를 사용하면 됩니다. 정렬이나 조건 비교에 더 유용하게 활용할 수 있습니다.
mysql> select month(PurchaseDate),sum(Price) from SelectPerMonthDemo -> group by month(PurchaseDate);
출력 결과
+---------------------+------------+ | month(PurchaseDate) | sum(Price) | +---------------------+------------+ | 1 | 1800 | | 4 | 600 | | 2 | 400 | | 5 | 800 | | 6 | 1000 | +---------------------+------------+ 5 rows in set (0.00 sec)
정리
MySQL에서 월별 데이터를 집계할 때는 monthname() 또는 month() 함수로 구매 날짜의 월을 추출하고, GROUP BY 절로 그룹화한 뒤 SUM() 함수로 원하는 값을 집계하면 됩니다. 이 방식은 매출 보고서나 통계 대시보드를 만들 때 매우 유용하게 활용됩니다.