Contents
내가 작성한 쿼리

각 시즌에 가장 인기 있는 제품 카테고리를 찾기 위한 솔루션을 작성하세요. 시즌은 다음과 같이 정의됩니다: * 겨울: 12월, 1월, 2월 * 봄: 3월, 4월, 5월 * 여름: 6월, 7월, 8월 * 가을: 9월, 10월, 11월 카테고리의 인기는 해당 시즌에 판매된 총 수량에 따라 결정됩니다. 동점일 경우 총 수익이 가장 높은 카테고리(수량 × 가격)를 선택합니다. 계절별로 정렬된 결과 표를 오름차순으로 반환합니다.
내가 작성한 쿼리
Oracle
WITH sales_with_season AS ( SELECT s.*, p.category, CASE WHEN EXTRACT(MONTH FROM s.sale_date) IN (12, 1, 2) THEN 'Winter' WHEN EXTRACT(MONTH FROM s.sale_date) IN (3, 4, 5) THEN 'Spring' WHEN EXTRACT(MONTH FROM s.sale_date) IN (6, 7, 8) THEN 'Summer' ELSE 'Fall' END AS season FROM sales s JOIN products p ON s.product_id = p.product_id ), category_stats AS ( SELECT season, category, SUM(quantity) AS total_quantity, SUM(quantity * price) AS total_revenue FROM sales_with_season GROUP BY season, category ), ranked_categories AS ( SELECT category_stats.*, RANK() OVER ( PARTITION BY season ORDER BY total_quantity DESC, total_revenue DESC ) AS rk FROM category_stats ) SELECT season, category, total_quantity, ROUND(total_revenue, 2) AS total_revenue FROM ranked_categories WHERE rk = 1 ORDER BY season;
MySQL
-- 1단계: 각 판매 내역에 계절(season)과 카테고리(category) 컬럼 추가 WITH sales_with_season AS ( SELECT s.*, -- 판매 테이블의 모든 컬럼 p.category, -- 상품 카테고리 CASE -- 판매 월에 따라 계절 분류 WHEN MONTH(s.sale_date) IN (12, 1, 2) THEN 'Winter' WHEN MONTH(s.sale_date) IN (3, 4, 5) THEN 'Spring' WHEN MONTH(s.sale_date) IN (6, 7, 8) THEN 'Summer' ELSE 'Fall' -- 9,10,11월은 Fall END AS season FROM sales s JOIN products p ON s.product_id = p.product_id -- 상품 ID 기준으로 products와 조인 ), -- 2단계: 계절과 카테고리별로 총 수량, 총 매출을 집계 category_stats AS ( SELECT season, category, SUM(quantity) AS total_quantity, -- 총 판매 수량 SUM(quantity * price) AS total_revenue -- 총 매출액 FROM sales_with_season GROUP BY season, category ), -- 3단계: 계절별로 카테고리에 순위 부여 ranked_categories AS ( SELECT *, RANK() OVER ( PARTITION BY season -- 계절별로 나누고 ORDER BY total_quantity DESC, -- 수량 높은 순 total_revenue DESC -- 수량이 같다면 매출 높은 순 ) AS rank FROM category_stats ) -- 4단계: 순위 1위인 카테고리만 선택하여 출력 SELECT season, category, total_quantity, ROUND(total_revenue, 2) AS total_revenue -- 매출은 소수 둘째자리까지 반올림 FROM ranked_categories WHERE rank = 1 -- 1등만 선택 ORDER BY season; -- 계절 순으로 정렬
차이점
- 월(Month) 추출 방식의 차이
Oracle
:EXTRACT(추출요소(MONTH) FROM 추출할 컬럼)
MySQL
:MONTH(추출할 컬럼)
Share article