SQL

[SQL#10] CASE

j.d 2025. 4. 16. 20:38

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