개요
MySQL에서 특정 열에 중복된 값이 여러 번 저장되어 있을 때, GROUP BY 절과 COUNT(DISTINCT) 함수를 조합하면 각 ID별로 고유한 값이 몇 개인지 손쉽게 집계할 수 있습니다. 이 글에서는 예제 테이블을 만들고, 중복된 고객 ID(CustomerId)를 기준으로 고유한 리뷰 번호(CustomerReviewNumber)의 개수를 계산해 별도의 열에 표시하는 과정을 단계별로 살펴봅니다.
1단계: 테이블 생성
먼저 아래 쿼리로 예제 테이블을 생성합니다.
mysql> create table DemoTable1453
-> (
-> CustomerId int,
-> CustomerReviewNumber int
-> );
Query OK, 0 rows affected (0.58 sec)
2단계: 샘플 데이터 삽입
INSERT 명령으로 레코드를 입력합니다. 의도적으로 동일한 고객 ID와 리뷰 번호가 반복되는 중복 데이터를 포함시켰습니다.
mysql> insert into DemoTable1453 values(10,4);
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable1453 values(10,4);
Query OK, 1 row affected (0.08 sec)
mysql> insert into DemoTable1453 values(11,5);
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable1453 values(11,5);
Query OK, 1 row affected (0.07 sec)
mysql> insert into DemoTable1453 values(11,5);
Query OK, 1 row affected (0.06 sec)
mysql> insert into DemoTable1453 values(13,2);
Query OK, 1 row affected (0.27 sec)
mysql> insert into DemoTable1453 values(11,5);
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable1453 values(10,4);
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable1453 values(13,2);
Query OK, 1 row affected (0.14 sec)
3단계: 전체 레코드 확인
SELECT 문으로 테이블에 저장된 모든 레코드를 조회합니다.
mysql> select * from DemoTable1453;
실행 결과는 다음과 같습니다.
+------------+----------------------+
| CustomerId | CustomerReviewNumber |
+------------+----------------------+
| 10 | 4 |
| 10 | 4 |
| 11 | 5 |
| 11 | 5 |
| 11 | 5 |
| 13 | 2 |
| 11 | 5 |
| 10 | 4 |
| 13 | 2 |
+------------+----------------------+
9 rows in set (0.00 sec)
위 결과에서 볼 수 있듯이, 고객 ID 10은 3번, 11은 4번, 13은 2번 반복되어 총 9개의 행이 존재합니다.
4단계: 중복 ID 기준으로 고유 값 개수 집계
다음 쿼리는 COUNT(DISTINCT) 함수와 GROUP BY 절을 사용하여 고객 ID별로 중복을 제거한 리뷰 번호의 개수를 계산하고, 그 결과를 별도의 열에 표시합니다.
mysql> select CustomerId,count(distinct CustomerReviewNumber)
-> from DemoTable1453
-> group by CustomerId;
실행 결과는 다음과 같습니다.
+------------+--------------------------------------+
| CustomerId | count(distinct CustomerReviewNumber) |
+------------+--------------------------------------+
| 10 | 1 |
| 11 | 1 |
| 13 | 1 |
+------------+--------------------------------------+
3 rows in set (0.14 sec)
결과 해석
COUNT(DISTINCT CustomerReviewNumber)는 같은 값을 여러 번 세지 않고 고유한 값만 카운트합니다. 따라서 고객 ID 10, 11, 13 각각이 하나의 고유한 리뷰 번호(각각 4, 5, 2)만 가지고 있으므로, 모든 그룹의 결과가 1로 표시됩니다. 만약 한 고객이 서로 다른 리뷰 번호를 여러 개 가지고 있다면, 해당 고객의 행에는 그 개수가 그대로 출력됩니다.
정리
GROUP BY로 대상 열을 그룹화한 뒤 COUNT(DISTINCT)를 적용하면, 중복 데이터가 많은 테이블에서도 ID별 고유 값의 개수를 깔끔하게 집계할 수 있습니다. 이 패턴은 로그 분석, 주문 내역 집계, 사용자 활동 통계 등 실무에서 매우 자주 활용되는 기법이니 꼭 익혀두시기 바랍니다.