하나의 열에 담긴 여러 개의 서로 다른 값을 조건별로 나누어 각각의 합계(또는 개수)를 한 번에 집계하고 싶다면 CASE 문을 활용하면 됩니다. CASE 문은 조건에 따라 다른 값을 반환하므로, SUM 함수와 GROUP BY 절과 함께 사용하면 조건별 집계를 손쉽게 구현할 수 있습니다.
먼저 예제에 사용할 테이블을 생성해 보겠습니다.
mysql> create table DemoTable
(
ProductName varchar(100),
ProductRating ENUM('1','2','3')
);
Query OK, 0 rows affected (0.50 sec)생성한 테이블에 insert 명령으로 샘플 레코드를 삽입합니다.
mysql> insert into DemoTable values('Product-1',3);
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable values('Product-2',1);
Query OK, 1 row affected (0.08 sec)
mysql> insert into DemoTable values('Product-3',2);
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable values('Product-1',2);
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable values('Product-3',3);
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable values('Product-2',2);
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable values('Product-3',3);
Query OK, 1 row affected (0.10 sec)select 문으로 테이블의 전체 레코드를 확인해 보겠습니다.
mysql> select *from DemoTable;
실행 결과는 다음과 같습니다.
+-------------+---------------+ | ProductName | ProductRating | +-------------+---------------+ | Product-1 | 3 | | Product-2 | 1 | | Product-3 | 2 | | Product-1 | 2 | | Product-3 | 3 | | Product-2 | 2 | | Product-3 | 3 | +-------------+---------------+ 7 rows in set (0.00 sec)
조건별 합계를 구하는 쿼리
이제 제품 평점(ProductRating)을 기준으로, 평점 1·2·3이 각각 몇 번 등장했는지 제품별로 집계하는 쿼리를 작성해 보겠습니다. 열 안의 서로 다른 3개 값(1, 2, 3)을 각각 합산하여 하나의 결과 집합으로 표시하는 것이 핵심입니다.
mysql> select ProductName,
sum( case when ProductRating=3 then 1 else 0 end ) as Product_3_Rating,
sum( case when ProductRating=2 then 1 else 0 end ) as Product_2_Rating,
sum( case when ProductRating=1 then 1 else 0 end ) as Product_1_Rating
from DemoTable
group by ProductName;위 쿼리의 실행 결과는 다음과 같습니다.
+-------------+------------------+------------------+------------------+ | ProductName | Product_3_Rating | Product_2_Rating | Product_1_Rating | +-------------+------------------+------------------+------------------+ | Product-1 | 1 | 1 | 0 | | Product-2 | 0 | 1 | 1 | | Product-3 | 2 | 1 | 0 | +-------------+------------------+------------------+------------------+ 3 rows in set (0.00 sec)
쿼리 동작 원리
이 쿼리가 어떻게 동작하는지 살펴보겠습니다.
1. CASE 문의 역할: 각 행마다 case when ProductRating=3 then 1 else 0 end와 같은 조건식이 평가됩니다. 해당 조건이 참이면 1을, 거짓이면 0을 반환합니다.
2. SUM 함수의 역할: CASE 문이 반환한 1과 0의 값을 모두 더하면, 결국 해당 조건을 만족하는 행의 개수가 됩니다.
3. GROUP BY의 역할: ProductName을 기준으로 그룹화하기 때문에, 제품별로 평점 1·2·3의 등장 횟수가 각각 별도의 열로 집계됩니다.
결과를 보면 Product-1은 평점 3이 1회, 평점 2가 1회, 평점 1은 0회인 것을 한눈에 확인할 수 있습니다. 이처럼 CASE 문과 SUM, GROUP BY를 조합하면 피벗(pivot) 형태의 조건별 집계 결과를 별도의 복잡한 처리 없이 간단하게 얻을 수 있습니다.