SQL에서 CASE는 조건에 따라 다른 값을 반환하는 조건문입니다.
프로그래밍 언어의 if-else나 switch처럼 사용할 수 있으며,
데이터를 가공하거나 집계 값을 가로 방향으로 펼치는 피벗(pivot) 작업에도 자주 활용됩니다.
CASE
WHEN 조건1 THEN 결과1
WHEN 조건2 THEN 결과2
...
ELSE 기본값
END
- WHEN과 THEN을 반복하여 여러 조건을 나열할 수 있습니다.
- ELSE는 생략 가능하며, 해당 조건이 없을 경우 기본값을 반환합니다.
예시
예시 테이블: sales
id | name | region | quarter | amount |
1 | Alice | East | Q1 | 1000 |
2 | Alice | East | Q2 | 1500 |
3 | Bob | West | Q1 | 2000 |
4 | Bob | West | Q2 | 2500 |
5 | Charlie | East | Q1 | NULL |
6 | Charlie | East | Q2 | 1800 |
1) 조건 분기
SELECT name, region, amount,
CASE
WHEN amount >= 2000 THEN 'High'
WHEN amount >= 1000 THEN 'Mid'
ELSE 'Low'
END AS 등급
FROM sales;
→ amount 값에 따라 등급을 구분했습니다.
NULL은 비교 연산이 불가하므로 ELSE 'Low'로 처리됩니다.
name | region | amount | 등급 |
Alice | East | 1000 | Mid |
Alice | East | 1500 | Mid |
Bob | West | 2000 | High |
Bob | West | 2500 | High |
Charlie | East | NULL | Low |
Charlie | East | 1800 | Mid |
2) 조건별 집계
SELECT region,
COUNT(CASE WHEN amount >= 2000 THEN 1 END) AS 고액건수,
SUM(CASE WHEN amount < 2000 THEN amount ELSE 0 END) AS 중소액합계
FROM sales
GROUP BY region;
→ CASE로 조건을 분리하여 COUNT와 SUM을 수행했습니다.
NULL은 자동 제외됩니다.
region | 고액건수 | 중소액합계 |
East | 0 | 4300 |
West | 2 | 0 |
Pivot 처리
MySQL은 PIVOT 문법을 지원하지 않기 때문에, CASE를 사용해 수동으로 열을 만들어야 합니다.
SELECT
name,
SUM(CASE WHEN quarter = 'Q1' THEN amount ELSE 0 END) AS Q1_sales,
SUM(CASE WHEN quarter = 'Q2' THEN amount ELSE 0 END) AS Q2_sales
FROM sales
GROUP BY name;
name | Q1_sales | Q2_sales |
Alice | 1000 | 1500 |
Bob | 2000 | 2500 |
Charlie | 0 | 1800 |
'SQL' 카테고리의 다른 글
[SQL#12] UNION / UNION ALL (0) | 2025.04.16 |
---|---|
[SQL#11] JOIN (0) | 2025.04.16 |
[SQL#9] GROUP BY / HAVING (0) | 2025.04.16 |
[SQL#8] COUNT / SUM / AVG / MIN / MAX (0) | 2025.04.16 |
[SQL#7] ROUND / CEIL / FLOOR (0) | 2025.04.16 |