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 |