SQL

CASE WHEN의 활용 (Salaries Difference, 가구 판매의 비중이 높았던 날 찾기)

seonghojang 2024. 1. 22. 16:05

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까지 걸어서 비율을 구했다.

생각보다 여러가지로 신경써야 할 것이 많았던 문제..