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

MySQL CASE 문에서 열 데이터 활용하기 – 국가별 학생 수 집계 예제

MySQL의 CASE 문은 조건에 따라 서로 다른 값을 반환할 수 있는 강력한 제어문입니다. 특히 CASE 문 내부에 테이블의 열(column) 데이터를 활용하면 조건부 집계를 매우 손쉽게 구현할 수 있습니다. 이해를 돕기 위해 'Students' 테이블의 데이터를 먼저 살펴보겠습니다.

mysql> Select * from Students;
+----+-----------+-----------+----------+----------------+
| id | Name      | Country   | Language | Course         |
+----+-----------+-----------+----------+----------------+
| 1  | Francis   | UK        | English  | Literature     |
| 2  | Rick      | USA       | English  | History        |
| 3  | Correy    | USA       | English  | Computers      |
| 4  | Shane     | France    | French   | Computers      |
| 5  | Validimir | Russia    | Russian  | Computers      |
| 6  | Steve     | Australia | English  | Geoinformatics |
| 7  | Rahul     | India     | Hindi    | Yoga           |
| 8  | Harshit   | India     | Hindi    | Computers      |
| 9  | Harry     | NZ        | English  | Electronics    |
+----+-----------+-----------+----------+----------------+
9 rows in set (0.00 sec)

열 데이터를 활용한 CASE 문 작성

이제 USA, UK, NZ, INDIA, RUSSIA, FRANCE 등 각 국가별로 학생이 몇 명인지 확인하고 싶다고 가정해 보겠습니다. 이 경우 CASE 문 안에서 'country' 열을 조건으로 활용하면 됩니다.

mysql> Select SUM(CASE WHEN country = 'USA' THEN 1 ELSE 0 END) AS USA,
-> SUM(CASE WHEN country = 'UK' THEN 1 ELSE 0 END) AS UK,
-> SUM(CASE WHEN country = 'INDIA' THEN 1 ELSE 0 END) AS INDIA,
-> SUM(CASE WHEN country = 'Russia' THEN 1 ELSE 0 END) AS Russia,
-> SUM(CASE WHEN country = 'France' THEN 1 ELSE 0 END) AS France,
-> SUM(CASE WHEN country = 'NZ' THEN 1 ELSE 0 END) AS NZ,
-> SUM(CASE WHEN country = 'Australia' THEN 1 ELSE 0 END) AS Australia
-> From Students;
+------+------+-------+--------+--------+------+-----------+
| USA  | UK   | INDIA | Russia | France | NZ   | Australia |
+------+------+-------+--------+--------+------+-----------+
| 2    | 1    | 2     | 1      | 1      | 1    | 1         |
+------+------+-------+--------+--------+------+-----------+
1 row in set (0.07 sec)

쿼리 동작 원리

위 쿼리의 핵심은 조건부 집계(Conditional Aggregation) 기법입니다. 각 행마다 CASE 문이 평가되어, 조건(country = 'USA' 등)이 참이면 1을, 거짓이면 0을 반환합니다. 그리고 SUM 함수가 이 값들을 모두 더하기 때문에, 결과적으로 해당 조건을 만족하는 행의 개수, 즉 국가별 학생 수가 계산됩니다.

예를 들어 USA는 Rick과 Correy 두 명이므로 결과값이 2로 나오고, 나머지 국가들은 각각 1명씩 있으므로 1이 출력됩니다.

참고: 대안적인 접근 방법

같은 결과를 얻기 위해 SUM 대신 COUNT를 사용할 수도 있습니다. COUNT(CASE WHEN country = 'USA' THEN 1 END)처럼 ELSE 부분을 생략하면 조건이 거짓일 때 NULL이 반환되고, COUNT는 NULL을 세지 않으므로 동일한 집계 결과를 얻을 수 있습니다. 또한 단순히 국가별 건수만 필요하다면 GROUP BY country 절을 사용하는 것이 더 간결할 수 있습니다. 다만 위와 같은 피벗(pivot) 형태로 국가를 열로 배치해야 하는 보고서에는 CASE 문을 활용한 방식이 가장 적합합니다.