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