개요
MySQL에서 전체 점수의 합계를 고유 ID(중복을 제거한 ID)의 개수로 나누어 평균을 구해야 하는 경우가 있습니다. 이때는 DISTINCT 키워드와 COUNT() 함수를 함께 사용하면 간단하게 해결할 수 있습니다.
이 글에서는 예제 테이블을 만들고, 고유 ID 개수를 기준으로 Score 열의 총합에 대한 평균을 구하는 과정을 단계별로 살펴보겠습니다.
1. 예제 테이블 생성하기
먼저 Id와 Score 두 개의 열을 가진 테이블을 생성합니다.
mysql> create table DemoTable
-> (
-> Id int,
-> Score int
-> );
Query OK, 0 rows affected (0.95 sec)
2. 데이터 삽입하기
INSERT 명령을 사용하여 몇 개의 레코드를 추가합니다. 여기서는 ID가 중복되는 데이터를 의도적으로 넣었습니다.
mysql> insert into DemoTable values(10,90);
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable values(10,190);
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable values(11,230);
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable values(11,130);
Query OK, 1 row affected (0.17 sec)
3. 저장된 데이터 확인하기
SELECT 문으로 테이블의 모든 레코드를 조회합니다.
mysql> select *from DemoTable;
실행 결과는 다음과 같습니다.
+------+-------+
| Id | Score |
+------+-------+
| 10 | 90 |
| 10 | 190 |
| 11 | 230 |
| 11 | 130 |
+------+-------+
4 rows in set (0.00 sec)
4. 고유 ID 개수로 평균 구하기
핵심 쿼리는 다음과 같습니다.
mysql> SELECT SUM(Score) / COUNT(DISTINCT Id) from DemoTable;
이 쿼리의 동작 원리를 살펴보겠습니다.
SUM(Score): Score 열 값 전체의 합계를 구합니다. 즉, 90 + 190 + 230 + 130 = 640COUNT(DISTINCT Id): 중복을 제거한 고유 ID의 개수를 구합니다. 이 예제에서는 10과 11 두 개이므로 2
따라서 최종 결과는 640 ÷ 2 = 320이 됩니다.
+---------------------------------+
| SUM(Score) / COUNT(DISTINCT Id) |
+---------------------------------+
| 320.0000 |
+---------------------------------+
1 row in set (0.00 sec)
정리
ID가 중복된 데이터가 있을 때 단순히 AVG() 함수를 사용하면 레코드 수 기준으로 평균이 계산되어 원하는 결과를 얻지 못할 수 있습니다. 이처럼 SUM()과 COUNT(DISTINCT ...)를 조합하면, 고유 ID 개수를 기준으로 한 정확한 평균값을 손쉽게 계산할 수 있습니다.