19. [SQL 코테] pivot case when

Jason·2026년 1월 14일

SQL

목록 보기
18/47

[SQL 코테] CASE WHEN 피벗 패턴 완전 정복 🔥

📝 문제: 월별 카테고리 매출 피벗

테이블 구조

sales 테이블
sale_id | sale_date   | category | amount
--------|-------------|----------|--------
1       | 2024-01-05  | 음식     | 10000
2       | 2024-01-10  | 패션     | 25000
3       | 2024-01-15  | 음식     | 15000
4       | 2024-02-05  | 음식     | 20000
5       | 2024-02-10  | 패션     | 30000
6       | 2024-02-20  | 전자     | 50000

요구사항

  • 월별로 각 카테고리 매출을 컬럼으로 펼쳐서 보여주기
  • 행 → 열 변환 (피벗)

✅ 정답 쿼리

SELECT
  DATE_FORMAT(sale_date, '%Y-%m') AS sale_month,
  SUM(CASE WHEN category = '음식' THEN amount ELSE 0 END) AS 음식,
  SUM(CASE WHEN category = '패션' THEN amount ELSE 0 END) AS 패션,
  SUM(CASE WHEN category = '전자' THEN amount ELSE 0 END) AS 전자
FROM sales
GROUP BY sale_month
ORDER BY sale_month;

결과

sale_month | 음식  | 패션  | 전자
-----------|-------|-------|-------
2024-01    | 25000 | 25000 | 0
2024-02    | 20000 | 30000 | 50000

💡 핵심 패턴

피벗 공식

SUM(CASE WHEN 조건 THENELSE 0 END) AS 컬럼명

동작 원리

CASE WHEN이 하는 일:

sale_id | category | amount | CASE WHEN category='음식' THEN amount ELSE 0
--------|----------|--------|---------------------------------------------
1       | 음식     | 10000  | 10000  ← 조건 맞음!
2       | 패션     | 25000  | 0      ← 조건 안 맞음
3       | 음식     | 15000  | 15000  ← 조건 맞음!

SUM으로 합치면:

  • 2024-01 음식: 10000 + 15000 = 25000

🔄 피벗 전 vs 후

피벗 전 (행 형태)

sale_month | category | total
-----------|----------|-------
2024-01    | 음식     | 25000
2024-01    | 패션     | 25000
2024-02    | 음식     | 20000
2024-02    | 패션     | 30000
2024-02    | 전자     | 50000

피벗 후 (열 형태)

sale_month | 음식  | 패션  | 전자
-----------|-------|-------|-------
2024-01    | 25000 | 25000 | 0
2024-02    | 20000 | 30000 | 50000

❌ 틀린 접근

-- ❌ SELECT 안에 SELECT 이렇게 안 됨
SELECT
  SELECT SUM(amount) FROM sales WHERE category = '음식' AS 음식
FROM sales

-- ✅ CASE WHEN 써야 함
SELECT
  SUM(CASE WHEN category = '음식' THEN amount ELSE 0 END) AS 음식
FROM sales

🎯 응용 패턴

COUNT로 피벗 (건수)

COUNT(CASE WHEN category = '음식' THEN 1 END) AS 음식_건수

AVG로 피벗 (평균)

AVG(CASE WHEN category = '음식' THEN amount END) AS 음식_평균

NULL 처리

-- ELSE 0 대신 ELSE NULL → 집계에서 제외됨
SUM(CASE WHEN category = '음식' THEN amount ELSE NULL END)

🎯 라이브 코테 체크리스트

  • 피벗 = SUM(CASE WHEN 조건 THEN 값 ELSE 0 END)
  • SELECT 안에 SELECT 넣지 않기
  • GROUP BY 잊지 않기
  • 없는 값은 ELSE 0으로 처리

채널톡 DA 인턴 코테 준비 중 정리한 내용입니다 🚀

profile
Data Analyst | Thoughts Become Things. 할 수 있다고 생각하면 할 수 있다. 할 수 없다고 생각하면 할 수 없다. | www.linkedin.com/in/명수-제-7ab843200

0개의 댓글