https://solvesql.com/problems/day-of-furniture/
전체 카테고리 중 'Furniture' 카테고리의 주문 비중을 알아보는 문제
WITH c_fu AS( --furniture 수
SELECT
order_date,
order_id,
COUNT(DISTINCT order_id) AS fu_cnt
FROM
records
WHERE 1=1
AND category ='Furniture'
GROUP BY
order_date
),
c_all AS(-- 전체 카테고리 수
SELECT
order_date,
order_id,
COUNT(DISTINCT order_id) AS all_cnt
FROM
records
GROUP BY
order_date
)
SELECT
c_all.order_date,
c_fu.fu_cnt AS furniture,
-- c_all.all_cnt,
ROUND((CAST(c_fu.fu_cnt AS float)/c_all.all_cnt)*100,2) AS furniture_pct
FROM
c_fu
RIGHT JOIN c_all
ON c_fu.order_date=c_all.order_date
WHERE 1=1
AND c_all.all_cnt>=10
AND furniture_pct>=40
ORDER BY
furniture_pct DESC,
c_all.order_date
나는 furniture 카테고리 주문 수와 전체 카테고리 주문 수를 CTE로 만들어서 진행했다.
그런데!!! 진짜 이해가 안되는 부분이 있다.
왜 COUNT 할때 DISTINCT를 사용해야 되는가?
같은 고객이 하루에 의자, 책상을 구매할 수 있는데 그럼 2개로 카운트해야지 왜 1개로 카운트하려고 하는건지 이해가 안된다.
그럴거면 해설에 좀 더 설명을 넣어놓지...
주문자를 기준으로 하라고 말이다....!!!!!!!!
아래는 CTE사용하지 않고 풀어본 거다.
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)/
CAST(COUNT(DISTINCT order_id) AS FLOAT)*100,2) AS furniture_pct
FROM
records
GROUP BY
order_date
HAVING 1=1
AND COUNT(DISTINCT order_id)>=10
AND furniture_pct>=40
ORDER BY
furniture_pct DESC,
order_date