728x90
반응형
📘 2-3. GROUP BY와 CASE WHEN을 활용한 조건부 집계
실무에서는 하나의 쿼리에서 여러 조건별로 데이터를 집계해야 하는 경우가 많습니다.
이럴 때 GROUP BY와 CASE WHEN을 함께 사용하면 조건별 카운트, 합계 등을 효율적으로 처리할 수 있습니다.
📌 기본 개념
CASE WHEN
을 SUM
또는 COUNT
와 함께 사용하여 조건에 맞는 데이터를 분기 처리합니다.
SELECT
user_id,
SUM(CASE WHEN status = 'complete' THEN 1 ELSE 0 END) AS complete_count,
SUM(CASE WHEN status = 'cancel' THEN 1 ELSE 0 END) AS cancel_count
FROM orders
GROUP BY user_id;
📌 의미: 사용자별로 주문 상태가 완료인 건수와 취소된 건수를 각각 계산합니다.
✅ 예제 1: 월별 결제 상태별 주문 수
SELECT
DATE_FORMAT(created_at, '%Y-%m') AS month,
COUNT(*) AS total_orders,
SUM(CASE WHEN status = 'paid' THEN 1 ELSE 0 END) AS paid_orders,
SUM(CASE WHEN status = 'pending' THEN 1 ELSE 0 END) AS pending_orders,
SUM(CASE WHEN status = 'cancelled' THEN 1 ELSE 0 END) AS cancelled_orders
FROM orders
GROUP BY month
ORDER BY month DESC;
✅ 예제 2: 상품 카테고리별 남녀 구매자 수
SELECT
category_id,
SUM(CASE WHEN gender = 'M' THEN 1 ELSE 0 END) AS male_buyers,
SUM(CASE WHEN gender = 'F' THEN 1 ELSE 0 END) AS female_buyers
FROM purchases
GROUP BY category_id;
✅ 예제 3: 지역별 회원 등급 분포
SELECT
region,
SUM(CASE WHEN grade = 'bronze' THEN 1 ELSE 0 END) AS bronze_count,
SUM(CASE WHEN grade = 'silver' THEN 1 ELSE 0 END) AS silver_count,
SUM(CASE WHEN grade = 'gold' THEN 1 ELSE 0 END) AS gold_count
FROM users
GROUP BY region;
💡 실무 팁
- 조건이 많을 경우
CASE WHEN
으로 열을 나누면 데이터 시각화나 리포트용으로 유용함 - IF 대신 CASE WHEN을 쓰면 가독성과 확장성이 높음
NULL
처리를 명확히 하지 않으면 결과가 왜곡될 수 있음 (ELSE 0 필수)
📚 다음 글 예고
다음 포스팅에서는 2-4. 조건 만족 누적합 (Cumulative SUM) 편으로 넘어갑니다.
👉 일자별 또는 조건별로 누적 통계를 구하는 실무 쿼리를 다룹니다.
728x90
반응형
'DB 데이터 > 실무 중심 쿼리 활용법' 카테고리의 다른 글
RANK, ROW_NUMBER를 활용한 순위 처리 (1) | 2025.05.10 |
---|---|
조건 만족 누적합 (Cumulative SUM) (0) | 2025.05.09 |
서브쿼리 vs JOIN 언제 어떻게 쓰나 (0) | 2025.05.07 |
조건부 COUNT와 SUM 쓰는 법 (1) | 2025.04.24 |