PostgreSQL집계와 분석

CASE WHEN과 조건부 집계

조건에 따라 값을 나누어 계산하거나, 특정 조건을 만족하는 행만 집계할 때 쓰는 CASE WHEN 패턴을 정리합니다.

마지막 수정 2026년 3월 22일

기본 패턴

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