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 문을 활용한 방식이 가장 적합합니다.