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

MySQL에서 날짜별로 GROUP BY와 COUNT를 활용하는 방법

MySQL에서 날짜별로 데이터를 그룹화하고 개수를 세고 싶다면 GROUP BY 절과 COUNT() 함수를 함께 사용하면 됩니다. 기본 문법은 다음과 같습니다.

SELECT yourColumnName1, yourColumnName2, ..N, COUNT(*) AS anyAliasName
FROM yourTableName
GROUP BY yourColumnName1, yourColumnName2;

예제 테이블 생성하기

문법을 이해하기 위해 실습용 테이블을 먼저 만들어 보겠습니다. 아래 쿼리로 테이블을 생성합니다.

mysql> create table GroupAndCountByDate
    -> (
    -> Id int NOT NULL AUTO_INCREMENT,
    -> TripDate date,
    -> ShopId int,
    -> PRIMARY KEY(Id)
    -> );
Query OK, 0 rows affected (0.79 sec)

샘플 데이터 삽입하기

이제 INSERT 명령어를 사용해 테이블에 여러 레코드를 추가합니다.

mysql> insert into GroupAndCountByDate(TripDate,ShopId) values('2019-01-31',10);
Query OK, 1 row affected (0.52 sec)
mysql> insert into GroupAndCountByDate(TripDate,ShopId) values('2019-02-01',15);
Query OK, 1 row affected (0.17 sec)
mysql> insert into GroupAndCountByDate(TripDate,ShopId) values('2019-01-31',10);
Query OK, 1 row affected (0.23 sec)
mysql> insert into GroupAndCountByDate(TripDate,ShopId) values('2019-02-01',15);
Query OK, 1 row affected (0.31 sec)
mysql> insert into GroupAndCountByDate(TripDate,ShopId) values('2019-03-23',20);
Query OK, 1 row affected (0.15 sec)
mysql> insert into GroupAndCountByDate(TripDate,ShopId) values('2019-04-21',25);
Query OK, 1 row affected (0.20 sec)
mysql> insert into GroupAndCountByDate(TripDate,ShopId) values('2019-03-13',20);
Query OK, 1 row affected (0.16 sec)
mysql> insert into GroupAndCountByDate(TripDate,ShopId) values('2019-04-06',25);
Query OK, 1 row affected (0.17 sec)

저장된 전체 레코드 확인하기

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

mysql> select *from GroupAndCountByDate;

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

+----+------------+--------+
| Id | TripDate   | ShopId |
+----+------------+--------+
|  1 | 2019-01-31 |     10 |
|  2 | 2019-02-01 |     15 |
|  3 | 2019-01-31 |     10 |
|  4 | 2019-02-01 |     15 |
|  5 | 2019-03-23 |     20 |
|  6 | 2019-04-21 |     25 |
|  7 | 2019-03-13 |     20 |
|  8 | 2019-04-06 |     25 |
+----+------------+--------+
8 rows in set (0.00 sec)

날짜별로 그룹화하고 개수 집계하기

날짜(TripDate)와 매장(ShopId)을 기준으로 그룹화한 뒤 각 그룹의 건수를 집계하는 쿼리는 다음과 같습니다.

mysql> select TripDate, ShopId, COUNT(*) as TOTALTRIP
    -> from GroupAndCountByDate
    -> group by TripDate, ShopId;

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

+------------+--------+-----------+
| TripDate   | ShopId | TOTALTRIP |
+------------+--------+-----------+
| 2019-01-31 |     10 |         2 |
| 2019-02-01 |     15 |         2 |
| 2019-03-23 |     20 |         1 |
| 2019-04-21 |     25 |         1 |
| 2019-03-13 |     20 |         1 |
| 2019-04-06 |     25 |         1 |
+------------+--------+-----------+
6 rows in set (0.00 sec)

결과 해석

위 결과를 보면 2019년 1월 31일(매장 10)과 2019년 2월 1일(매장 15)은 각각 중복된 데이터가 2건씩 있어 TOTALTRIP 값이 2로 집계되었습니다. 나머지 날짜는 고유한 조합이므로 모두 1로 표시됩니다. 이처럼 GROUP BY 절에 여러 컬럼을 지정하면 해당 컬럼들의 조합 기준으로 그룹이 형성되며, COUNT(*) 함수를 통해 각 그룹의 레코드 수를 손쉽게 확인할 수 있습니다.