Seongho Jang
CASE WHEN의 활용 (Salaries Difference, 가구 판매의 비중이 높았던 날 찾기) 본문
CASE WHEN 구문은
SELECT CASE WHEN condition = 'AAA' THEN 1
WHEN condition = 'BBB' THEN 2
ELSE 3
END AS cond1
와 같이 분류 용도로 쓰는 것은 알고 있었지만
아래 두 개 문제에서도 유용하게 사용될 수 있어서 기록차 적어놓는다.
1. Salaries Difference
StrataScratch - Salaries Differences
platform.stratascratch.com
Write a query that calculates the difference between the highest salaries found in the marketing and engineering departments. Output just the absolute difference in salaries.
SELECT ABS(MAX(CASE WHEN d.department = 'marketing' THEN e.salary END) -
MAX(CASE WHEN d.department = 'engineering' THEN e.salary END))
FROM db_employee e
INNER JOIN db_dept d
ON e.department_id = d.id
CASE WHEN department = 'marketing' THEN salary END를 계산하면,
department가 marketing인 케이스의 salary만 출력되고, 나머지는 NULL로 출력된다.
이렇게 되면 굳이 CTE를 사용하지 않거나 UNION 등을 쓰지 않아도 간결하게 쿼리를 쓸 수 있다.
2. 가구 판매의 비중이 높았던 날 찾기
https://solvesql.com/problems/day-of-furniture/
solvesql.com
SELECT order_date,
COUNT(DISTINCT CASE WHEN category = 'Furniture' THEN order_id END) as furniture,
ROUND(COUNT(DISTINCT CASE WHEN category = 'Furniture' THEN order_id END) /
(COUNT(DISTINCT order_id) + 0.00) * 100, 2) as furniture_pct
FROM records
GROUP BY order_date
HAVING COUNT(DISTINCT order_id) >= 10 AND furniture_pct >= 40
ORDER BY 3 DESC, 1;
이 문제의 경우에도 CASE WHEN category = 'Furniture' THEN order_id END를 계산하면
category가 Furniture인 경우에만 order_id가 나오고, 나머지는 NULL로 출력된다.
각 order_id에 세부 주문 사항이 많기 때문에 CASE WHEN 앞에 DISTINCT까지 걸어서 비율을 구했다.
생각보다 여러가지로 신경써야 할 것이 많았던 문제..
'SQL' 카테고리의 다른 글
[프로그래머스] 연도별 대장균 크기의 편차 구하기 (0) | 2024.04.17 |
---|---|
Leetcode 1280. Students and Examinations (0) | 2024.03.02 |
서브쿼리 (0) | 2024.01.18 |
[Hackerrrank] The PADS (0) | 2024.01.17 |
SQL 쿼리 작성 순서 (0) | 2024.01.17 |