우리는 실무에서 이런 요청을 정말 많이 받는다.
"구매한 유저 수만 따로 세어줘"
"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;

오늘도 고생했다
'5분 SQL' 카테고리의 다른 글
[MYSQL 09] DATE_FORMAT / YEAR / MONTH / DAY 개념과 실습 (0) | 2025.05.02 |
---|---|
[dbeaver 오류] 'Public Key Retrieval is not allowed' 해결 방법 (MySQL 8.x) (0) | 2025.05.01 |
[MYSQL 07] CASE WHEN 개념과 실습 (0) | 2025.04.27 |
[MYSQL 06] HAVING / MIN / MAX 개념과 실습 (0) | 2025.04.26 |
[MYSQL 05] GROUP BY / COUNT / SUM / AVG 개념과 실습 (0) | 2025.04.24 |