학습/SQL
[solvesql] SQL 풀어보기 - 가구 판매의 비중이 높았던 날 찾기
용이03
2025. 3. 8. 22:32
✔️ 문제
일별 주문 수가 10개 이상인 날 중에서, ‘Furniture’ 카테고리 주문의 비율이 40% 이상 이었던 날만 출력하는 쿼리를 작성해주세요. 카테고리의 주문 비율은 백분율로 계산하며, 반올림하여 소수점 둘째자리까지만 출력해주세요. Furniture 카테고리의 주문 비율이 높은 것부터 보여주도록 정렬하고, 비율이 같다면 날짜 순으로 정렬해주세요.
✔️ LEVEL 4
📌 주요 요구사항
- 일별 총 주문 수가 10개 이상인 날짜만 조회
- Furniture 카테고리의 주문 비율을 계산
- 이때, 주문 비율은 (Furniture 주문 수 / 전체 주문 수) × 100
- 백분율 값을 소수점 둘째 자리까지 반올림하여 출력해기
- Furniture 주문 비율이 40% 이상인 날짜만
- 조건에 맞게 정렬하기
WITH TOP_40PER AS (SELECT ORDER_DATE 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 ) + 0.00) /
(COUNT(DISTINCT ORDER_ID)+0.00),4) *100 furniture_pct
FROM RECORDS
GROUP BY ORDER_DATE
HAVING COUNT(DISTINCT ORDER_ID) >=10
)
SELECT *
FROM TOP_40PER
WHERE furniture_pct>= 40
ORDER BY furniture_pct DESC, ORDER_DATE
✍ 코드 해석
1. WITH TOP_40PER AS (...) 서브쿼리
- ORDER_DATE 별로 데이터를 그룹화하여 날짜별 주문 정보를 집계
- CASE WHEN을 사용하여 Furniture 카테고리 주문 수를 계산
- COUNT(DISTINCT CASE WHEN category = 'Furniture' THEN ORDER_ID END) AS furniture
- 중복 주문을 방지하기 위해 DISTINCT ORDER_ID를 사용 ( 한번에 여러가지 아이템을 주문 한 경우 id 별 주문 목록이 모두 저장되어있기 때문.)
- 전체 주문 대비 Furniture 주문 비율을 계산
- 정수 나눗셈을 방지하기 위해 + 0.00을 추가하여 실수 연산을 수행
- ROUND(..., 4) * 100을 사용하여 백분율 값을 소수점 둘째 자리까지 반올림
- HAVING COUNT(DISTINCT ORDER_ID) >= 10을 사용하여 일별 주문 수가 10개 이상인 경우만 필터링
2. 메인 쿼리
- WHERE furniture_pct >= 40을 사용하여 Furniture 주문 비율이 40% 이상인 날짜만 조회
- ORDER BY furniture_pct DESC, order_date를 사용하여 Furniture 주문 비율이 높은 순서로 정렬
- 비율이 같다면 날짜 오름차순으로 정렬
📌 실행 결과
총 12개의 날짜가 조건을 만족하여 출력되었습니다.
📌 정리
- 날짜별 주문 수 집계 및 필터링: GROUP BY ORDER_DATE와 HAVING 절 활용
- 특정 카테고리 비율 계산: CASE WHEN과 COUNT(DISTINCT ORDER_ID) 활용
- 정수 나눗셈 방지: + 0.00을 추가하여 실수 연산 수행
- 소수점 반올림 및 정렬: ROUND(..., 4) * 100 활용 및 ORDER BY 정렬