MySQL에서 두 개의 필드로 그룹화 후 개수 계산하기
데이터베이스 작업을 하다 보면 두 개 이상의 컬럼을 기준으로 데이터를 그룹화하고, 각 그룹별 건수를 집계해야 하는 경우가 자주 발생합니다. 이 글에서는 MySQL에서 두 개의 필드에 GROUP BY를 적용하고 COUNT 함수로 개수를 구하는 방법을 예제와 함께 단계별로 살펴보겠습니다.
1. 예제 테이블 생성
먼저 실습에 사용할 테이블을 생성합니다. 아래 쿼리는 Id와 Name 두 개의 컬럼을 가진 테이블을 만듭니다.
mysql> create table GroupByTwoFieldsDemo
-> (
-> Id int,
-> Name varchar(200)
-> );
Query OK, 0 rows affected (0.53 sec)
2. 샘플 데이터 삽입
그룹화 결과를 확인하기 위해 일부러 중복되는 값도 포함하여 여러 개의 레코드를 삽입합니다.
mysql> insert into GroupByTwoFieldsDemo values(1,'John');
Query OK, 1 row affected (0.15 sec)
mysql> insert into GroupByTwoFieldsDemo values(10,'Johnson');
Query OK, 1 row affected (0.16 sec)
mysql> insert into GroupByTwoFieldsDemo values(9,'Carol');
Query OK, 1 row affected (0.14 sec)
mysql> insert into GroupByTwoFieldsDemo values(6,'Sam');
Query OK, 1 row affected (0.16 sec)
mysql> insert into GroupByTwoFieldsDemo values(5,'David');
Query OK, 1 row affected (0.20 sec)
mysql> insert into GroupByTwoFieldsDemo values(10,'Johnson');
Query OK, 1 row affected (0.15 sec)
mysql> insert into GroupByTwoFieldsDemo values(6,'Sam');
Query OK, 1 row affected (0.17 sec)
3. 전체 레코드 조회
SELECT 문을 사용해 테이블에 저장된 모든 데이터를 확인합니다.
mysql> select *from GroupByTwoFieldsDemo;
실행 결과는 다음과 같습니다. Id=10(Johnson)과 Id=6(Sam)이 각각 두 번씩 들어가 있는 것을 볼 수 있습니다.
+------+---------+
| Id | Name |
+------+---------+
| 1 | John |
| 10 | Johnson |
| 9 | Carol |
| 6 | Sam |
| 5 | David |
| 10 | Johnson |
| 6 | Sam |
+------+---------+
7 rows in set (0.00 sec)
4. 두 컬럼으로 GROUP BY 하는 기본 문법
두 개의 컬럼을 기준으로 그룹화하고 개수를 세는 기본 문법은 다음과 같습니다.
select yourColumnName1, yourColumnName2, ....N, count(yourColumnName1)
from GroupByTwoFieldsDemo
group by yourColumnName1 desc, yourColumnName2;
여기서 group by 절에 첫 번째 컬럼은 내림차순(desc)으로 정렬 조건을 주고, 두 번째 컬럼도 함께 그룹화 기준으로 지정했습니다.
5. 실제 쿼리 적용 및 결과 확인
위 문법을 실제 테이블에 적용해 보겠습니다. Id와 Name을 기준으로 그룹화한 뒤, 각 그룹의 중복 건수를 출력합니다.
mysql> select Id, Name, count(Id) from GroupByTwoFieldsDemo group by id desc, Name;
실행 결과는 다음과 같습니다.
+------+---------+-----------+
| Id | Name | count(Id) |
+------+---------+-----------+
| 10 | Johnson | 2 |
| 9 | Carol | 1 |
| 6 | Sam | 2 |
| 5 | David | 1 |
| 1 | John | 1 |
+------+---------+-----------+
5 rows in set, 1 warning (0.00 sec)
결과 해석
- (10, Johnson)과 (6, Sam)은 각각 2건으로, 중복된 데이터가 그룹으로 묶인 것을 확인할 수 있습니다.
- 나머지 (9, Carol), (5, David), (1, John)은 1건씩 존재합니다.
- 전체 7개 행이 5개 그룹으로 압축되어 출력됩니다.
참고: ONLY_FULL_GROUP_BY 경고
결과 하단에 1 warning이 표시된 것을 알 수 있습니다. MySQL 5.7 이상에서는 기본적으로 ONLY_FULL_GROUP_BY SQL 모드가 활성화되어 있어, SELECT 절에 있는 컬럼이 반드시 GROUP BY 절에 포함되거나 집계 함수로 처리되어야 합니다. 위 예제처럼 SELECT 절의 모든 컬럼을 GROUP BY에 명시하면 안전하게 쿼리를 작성할 수 있습니다.
마무리
이처럼 MySQL에서는 GROUP BY 절에 여러 개의 컬럼을 나열하기만 하면 손쉽게 다중 필드 그룹화를 수행할 수 있으며, COUNT() 함수를 함께 사용하면 그룹별 데이터 건수까지 한 번에 집계할 수 있습니다. 중복 데이터 분석, 통계 리포트 작성 등 다양한 상황에서 유용하게 활용해 보시기 바랍니다.