5분 SQL

[MYSQL 08] CASE WHEN + SUM / COUNT 개념과 실습

nightquery 2025. 4. 28. 22:35

우리는 실무에서 이런 요청을 정말 많이 받는다.
"구매한 유저 수만 따로 세어줘"
"100 이상 결제한 금액만 합산해줘"
 
이때 필요한 게 바로 CASE WHEN + 집계 함수 조합이다.

 

| 실습용 테이블

SQL은 직접 쿼리를 실행하고 수정해보는 게 핵심!
아직 실습 환경이 없다면, 아래 글을 참고해 DBeaver와 MySQL부터 먼저 세팅해 보자
[SQL] 공부/실습 환경 세팅 – DBeaver + MySQL

[SQL] 공부/실습 환경 세팅 – DBeaver + MySQL

IT 직장에서의 N년차, SQL은 선택이 아니라 필수라는 것을 느겼다.24년에 자격증 취득하고 실무에서 조금씩 써먹는 중인데 처음에 겁먹었던 것이 무색하게 할 만하다. 앞으로의 포스팅들은 SQL을

happynestledays.tistory.com

 

CREATE DATABASE IF NOT EXISTS sql_blog;
USE sql_blog;

DROP TABLE IF EXISTS user_payment_log;

CREATE TABLE user_payment_log (
  payment_id INT AUTO_INCREMENT PRIMARY KEY,
  user_id INT,
  amount INT,
  status VARCHAR(20),
  paid_at DATETIME
);

INSERT INTO user_payment_log (user_id, amount, status, paid_at) VALUES
(101, 1200, 'completed', '2024-04-20 09:30:00'),
(102, 80, 'pending', '2024-04-20 10:15:00'),
(101, 200, 'completed', '2024-04-20 11:45:00'),
(103, NULL, 'cancelled', NULL),
(104, 150, 'completed', '2024-04-20 15:10:00');

 
 


0. CASE WHEN + SUM 기본 형태

SUM(CASE WHEN 조건 THEN 값 ELSE 0 END)

 
 
 

1. 기본 예제 – CASE WHEN 단일 행 + SUM

● 조건 : status가 'completed'인 결제 금액 합계 구하기

-- 방법 1
SELECT
  SUM(CASE WHEN status = 'completed' THEN amount ELSE 0 END) AS completed_amount
FROM user_payment_log;


-- 방법2
SELECT
  SUM(amount) AS completed_amount
FROM user_payment_log
WHERE status = 'completed';

 
 
 

2. 실무 예제 – CASE WHEN 여러 행 + SUM

조건 : completed, pending 각각 금액 따로 합산하기

SELECT
  SUM(CASE WHEN status = 'completed' THEN amount ELSE 0 END) AS completed_amount,
  SUM(CASE WHEN status = 'pending' THEN amount ELSE 0 END) AS pending_amount
FROM user_payment_log;

 
 
 

3. 실무 예제 - CASE WHEN 단일 행 + COUNT

조건 : 금액 100 이상 결제한 건수만 세기

--방법1
SELECT
  COUNT(CASE WHEN amount >= 100 THEN 1 END) AS high_value_payments
FROM user_payment_log;


--방법2
SELECT
  COUNT(*) AS high_value_payments
FROM user_payment_log
WHERE amount >= 100;

 
 
 

4. 실무 예제 - CASE WHEN 여러 행 + COUNT

조건 : completed, pending, cancelled 각각 건수 구하기

SELECT
  COUNT(CASE WHEN status = 'completed' THEN 1 END) AS completed_count,
  COUNT(CASE WHEN status = 'pending' THEN 1 END) AS pending_count,
  COUNT(CASE WHEN status = 'cancelled' THEN 1 END) AS cancelled_count
FROM user_payment_log;

 
 
 
 
오늘도 고생했다