🍋 ⚾️ 💻 🎬 🎮

Tech/SQL

[SQL] CASE WHEN

aeightchill 2025. 2. 8. 14:17
728x90

CASE WHEN

CASE WHEN은 조건에 따라 다른 값을 반환하는 제어문으로, IF-ELSE 문과 유사
 SQL 쿼리 내에서 값을 변환하거나 특정 로직을 적용할 수 있다.


기본

CASE
    WHEN 조건1 THEN 결과1
    WHEN 조건2 THEN 결과2
    ...
    ELSE 기본결과
END
  • WHEN 뒤에 조건 작성
  • THEN 뒤에 조건을 만족할 때 반환할 값 작성
  • (선택 사항 ELSE), 모든 조건이 불만족일 때 반환할 기본 값 설정

CASE WHEN

employees 테이블에서 급여(salary)에 따라 직급 구분하기

SELECT name, salary,
    CASE
        WHEN salary >= 7000 THEN 'High'
        WHEN salary >= 5000 THEN 'Medium'
        ELSE 'Low'
    END AS salary_level
FROM employees;

 

실행 결과 > 

name salary salary_level
Bob 7500 High
Ke 5200 Medium
Pil 4800 Low
Don 6100 Medium
Ah 8000 HIgh

CASE WHEN _ 그룹핑

orders 테이블에서 주문 상태(order_status)에 따라 그룹 나누기

→  CASE 문 안에서 특정 값(order_status)를 직접 비교 가능

SELECT order_id, order_status,
    CASE order_status
        WHEN 'shipped' THEN 'Completed'
        WHEN 'delivered' THEN 'Completed'
        WHEN 'pending' THEN 'In Progress'
        WHEN 'cancelled' THEN 'Failed'
        ELSE 'Unknown'
    END AS status_group
FROM orders;

 

실행 결과 > 

order_id order_status status_group
101 shipped Completed
102 pending In Progress
103 delivered Completed
104 cancelled Failed
105 processing Unknown

CASE WHEN _ SUM

각 급여 등급별로 직원 수 세기

SELECT 
    CASE 
        WHEN salary >= 7000 THEN 'High'
        WHEN salary >= 5000 THEN 'Medium'
        ELSE 'Low'
    END AS salary_level,
    COUNT(*) AS employee_count
FROM employees
GROUP BY salary_level;

 

실행 결과 > 

salary_level employee_count
High 2
Medium 2
Low 1

 


CASE WHEN _ UPDATE

직원의 급여가 6000 이상이면 보너스를 10%, 아니면 5%만 지급한다고 가정

→  CASE 문을 활용하여 bonus 값을 다르게 설정

UPDATE employees
SET bonus = 
    CASE 
        WHEN salary >= 6000 THEN salary * 0.1
        ELSE salary * 0.05
    END;

 

실행 결과 > 

name salary bonus
Bob 7500 750
Ke 5200 260
Pil 4800 240
Don 6100 610
Ah 8000 800

CASE WHEN _ ORDER BY

급여가 높은 직원부터 정렬하되, 동일 급여라면 등급이 높은 순서대로 정렬

→  salary_rank 값으로 정렬하여 High → Medium → Low 순으로 정렬

SELECT name, salary,
    CASE
        WHEN salary >= 7000 THEN 3  -- High
        WHEN salary >= 5000 THEN 2  -- Medium
        ELSE 1                      -- Low
    END AS salary_rank
FROM employees
ORDER BY salary_rank DESC, salary DESC;

 

실행 결과 > 

name salary salary_rank
Ah 8000 3
Bob 7500 3
Don 6100 2
Ke 5200 2
Pil 4800 1

 


CASE WHEN _ HAVING

직원 수가 5명 이상인 급여 그룹만 조회

→  HAVING 절을 활용해 직원 수가 5명 이상인 그룹만 필터링

SELECT 
    CASE 
        WHEN salary >= 7000 THEN 'High'
        WHEN salary >= 5000 THEN 'Medium'
        ELSE 'Low'
    END AS salary_level,
    COUNT(*) AS employee_count
FROM employees
GROUP BY salary_level
HAVING COUNT(*) >= 5;

 

 

실행 결과 > 

salary_level employee_count
(결과 없음) (결과 없음)
  • 위의 예제에서는 High : 2, Medium : 2, Low : 1로 어느 그룹도 5명 이상이 아니므로 결과 없음
  • 만약 직원 수를 늘려서 Medium : 5이면
salary_level employee_count
Medium 5

 

 

 

 

 

728x90

'Tech > SQL' 카테고리의 다른 글

[SQL] DATE_FORMAT (MySQL)  (0) 2025.04.06
[SQL] JOIN(조인)  (0) 2025.02.10
[SQL] COALESCE  (0) 2025.02.08
[SQL] ROUND, CEIL, FLOOR (반올림, 올림, 내림)  (0) 2025.02.08
[SQL] WITH AS (Common Table Expression, CTE)  (0) 2025.02.08