기본 패턴
sql
SELECT
COUNT(*) AS total_orders,
SUM(CASE WHEN status = 'paid' THEN amount ELSE 0 END) AS paid_amount,
COUNT(*) FILTER (WHERE status = 'cancelled') AS cancelled_count
FROM orders;설명
CASE WHEN은 SQL 안에서 조건 분기를 만드는 가장 기본적인 도구입니다. 값 자체를 바꾸거나, 집계 전에 특정 조건을 반영할 때 자주 쓰입니다.- 보고서 쿼리에서 특히 많이 보이는 패턴이 조건부 집계입니다. 예를 들어 결제 완료 금액만 합치거나, 취소 주문 개수만 세거나, 구간별로 다른 수치를 한 번에 뽑을 수 있습니다.
- PostgreSQL에서는
FILTER (WHERE ...)문법도 지원해서, 단순한 조건부 개수/합계는CASE WHEN보다 더 읽기 좋게 표현할 수 있습니다. - 중요한 감각은 "행을 먼저 분류하고, 그다음 집계한다"는 점입니다. 쿼리가 길어질수록 이 사고가 분명해야 결과 컬럼 의미도 명확해집니다.
- 실무에서는 대시보드, 정산, 상태별 통계, 기간별 비교에서 거의 필수적으로 등장합니다. 그래서
GROUP BY와 함께 읽는 습관이 중요합니다.
빠른 정리
| 패턴 | 잘 맞는 상황 |
|---|---|
CASE WHEN ... THEN ... END | 값 분기 |
SUM(CASE WHEN ... THEN amount ELSE 0 END) | 조건부 합계 |
COUNT(*) FILTER (WHERE ...) | 조건부 개수 |
| 잘 맞는 곳 | 리포트, 대시보드, 상태별 통계 |
주의할 점
CASE WHEN이 길어질수록 "컬럼이 무엇을 의미하는지"를 잃기 쉽습니다. 조건이 많은 집계는 alias를 분명히 붙이고,
필요하면 CTE로 한 단계 나눠 읽기 좋게 만드는 편이 좋습니다.
참고 링크
2 sources