DB 데이터/실무 중심 쿼리 활용법

조건부 COUNT와 SUM 쓰는 법

backend.log 2025. 4. 24. 18:01
728x90
반응형

📘 2-1. 조건부 COUNT와 SUM 쓰는 법

MySQL에서 조건을 기준으로 집계를 할 때는 CASE WHEN 또는 IF 문을 COUNTSUM 함수 안에 사용하는 방식이 자주 활용됩니다.
이 포스팅에서는 실무 예제를 통해 조건부 집계 쿼리를 정리합니다.


📌 기본 개념: 조건부 COUNT & SUM

SELECT
  COUNT(CASE WHEN status = 'active' THEN 1 END) AS active_count,
  SUM(CASE WHEN gender = 'M' THEN 1 ELSE 0 END) AS male_sum
FROM users;

status가 'active'인 사용자 수를 세고,
gender가 'M'인 사용자 수를 합산합니다.
COUNT는 NULL을 제외하고 세기 때문에 WHEN 조건을 만족하지 않으면 NULL이 되게 작성합니다.

✅ IF 문을 사용하는 방식도 가능

SELECT
  SUM(IF(status = 'active', 1, 0)) AS active_sum
FROM users;

→ 조건이 맞을 경우 1, 아니면 0을 더해서 전체 합계를 구합니다.


🛠 실무 예제 모음

✅ 1. 상태값별 주문 수

SELECT
  COUNT(*) AS total_orders,
  COUNT(CASE WHEN status = 'paid' THEN 1 END) AS paid_orders,
  COUNT(CASE WHEN status = 'cancelled' THEN 1 END) AS cancelled_orders
FROM orders;

✅ 2. 카테고리별 남성/여성 구매자 수

SELECT
  category_id,
  SUM(IF(gender = 'M', 1, 0)) AS male_count,
  SUM(IF(gender = 'F', 1, 0)) AS female_count
FROM purchases
GROUP BY category_id;

✅ 3. 월별 활성 회원 수 (login_at 기준)

SELECT
  DATE_FORMAT(login_at, '%Y-%m') AS month,
  COUNT(DISTINCT user_id) AS active_users
FROM user_logins
WHERE login_at >= DATE_SUB(NOW(), INTERVAL 6 MONTH)
GROUP BY month
ORDER BY month DESC;

✅ 4. 상품별 리뷰 평점 분포 (1~5점)

SELECT
  product_id,
  COUNT(*) AS total_reviews,
  SUM(IF(score = 5, 1, 0)) AS score_5,
  SUM(IF(score = 4, 1, 0)) AS score_4,
  SUM(IF(score = 3, 1, 0)) AS score_3,
  SUM(IF(score = 2, 1, 0)) AS score_2,
  SUM(IF(score = 1, 1, 0)) AS score_1
FROM reviews
GROUP BY product_id;

✅ 5. 유저 등급별 결제 여부에 따른 통계

SELECT
  grade,
  COUNT(*) AS total_users,
  SUM(IF(paid = 1, 1, 0)) AS paid_users,
  SUM(IF(paid = 0, 1, 0)) AS unpaid_users
FROM users
GROUP BY grade;

💡 CASE WHEN vs IF 차이

  • CASE WHEN: SQL 표준 문법, 복잡한 조건 표현 가능
  • IF: MySQL 전용 문법, 간단한 조건 처리에 유리

→ 실무에서는 단순 조건일 경우 IF, 복수 조건/여러 분기일 경우 CASE WHEN을 사용합니다.


📚 다음 글 예고

다음 포스팅에서는 서브쿼리 vs JOIN의 차이와 활용 상황을 비교하는
👉 2-2. 서브쿼리 vs JOIN 언제 어떻게 쓰나 편으로 넘어갑니다.

728x90
반응형