문제
US E-Commerce Records 2020 데이터셋은 미국 이커머스 웹사이트의 판매 데이터 입니다.
이 중 records 테이블은 주문 번호, 주문 날짜, 주문 지역, 카테고리 등 주문의 상세 정보를 담고 있습니다.
이 데이터를 이용하여 가구 판매의 비중이 높았던 날을 찾고 싶습니다.
일별 주문 수가 10개 이상인 날 중에서, ‘Furniture’ 카테고리 주문의 비율이 40% 이상 이었던 날만 출력하는 쿼리를 작성해주세요.
카테고리 정보는 category 컬럼에 기록되어 있습니다.
결과 데이터는 아래의 컬럼들을 포함해야 합니다.
Furniture 카테고리의 주문 비율은 백분율로 계산하며, 반올림하여 소수점 둘째자리까지만 출력해주세요.
Furniture 카테고리의 주문 비율이 높은 것부터 보여주도록 정렬하고, 비율이 같다면 날짜 순으로 정렬해주세요.
order_date - 주문 날짜
furniture - 해당 일의 Furniture 카테고리 주문 수
furniture_pct - 해당 일의 전체 주문 대비 Furniture 카테고리 주문의 비율 (%)
https://solvesql.com/problems/day-of-furniture/
문제 풀이
SELECT order_date,
-- 해당 일자의 Furniture 카테고리 주문 수
COUNT(DISTINCT CASE WHEN category = 'Furniture' THEN order_id END) AS furniture,
-- 해당 일자의 Furniture 카테고리 주문 비율
ROUND(
(COUNT(DISTINCT CASE WHEN category = 'Furniture' THEN order_id END) * 1.0 / COUNT(DISTINCT order_id)) * 100, 2
) AS furniture_pct
FROM records
GROUP BY order_date
HAVING COUNT(DISTINCT order_id) >= 10 -- 하루 10건 이상의 주문이 발생한 날
AND furniture_pct >= 40 -- Furniture 카테고리 주문 비율이 40% 이상인 날
ORDER BY furniture_pct DESC;
*SQLite에서는 나눗셈 연산을 할 때, 피연산자들이 모두 정수일 경우 결과도 정수로 반환됩니다.
이를 해결하기 위해 피연산자 중 하나를 실수로 변환하면 결과가 실수로 반환됩니다.
SQL을 독학하시는 분들에게 도움이 되길 바라며,
혹 더 좋은 방법이 있거나 오류가 있다면 편하게 말씀 부탁드립니다.