데이터 처리 도구/SQL 연습 기록

DAY 23 / [solvesql] 연습문제 5개 풀기

yourhm 2025. 6. 10. 12:54
난이도 풀기 문제 이름
난이도 3 3개 - 전날에 비해 미세먼지가 많이 증가한 날 찾기
- 누락된 펭귄의 몸무게 데이터를 추정하여 채우기
- 온라인 쇼핑몰의 월 별 매출액 집계
난이도 4 1개 - 파레토 법칙
난이도 5 1개 - 카테고리 별 매출 비율

 

 

카테고리 별 매출 비율

쿼리 효율성 비교해보기 

1) 윈도우 함수 + 서브쿼리를 사용할 때

SELECT category
     , sub_category
     , ROUND(MAX(sales_sub_category), 2) AS sales_sub_category
     , ROUND(MAX(sales_category), 2) AS sales_category
     , ROUND(MAX(sales_total), 2) AS sales_total
     , ROUND((MAX(sales_sub_category) / MAX(sales_category))*100, 2) AS pct_in_category
     , ROUND((MAX(sales_sub_category) / MAX(sales_total))*100, 2) AS pct_in_total
FROM (
      SELECT category
          , sub_category
          , SUM(sales) OVER(PARTITION BY sub_category) AS sales_sub_category
          , SUM(sales) OVER(PARTITION BY category) AS sales_category
          , SUM(sales) OVER() AS sales_total
      FROM records
      ) AS temp_tab
GROUP BY category, sub_category

 

1. records 테이블에서 윈도우 함수를 사용해 합계 계산하는 컬럼 생성

-- (1) 서브카테별 매출액 합계 계산 -> 컬럼: sales_sub_category

-- (2) 카테별 매출액 합계 계산 -> 컬럼: sales_category

-- (3) 전체 매출액 합계 계산 -> 컬럼: sales_total

2. 1번에서 만든 결과를 FROM 서브쿼리로 두고, GROUP BY 와 MAX()를 사용해 비율 계산

 

 

 

2) CTE + 조인을 사용할 때

WITH sub AS (
  SELECT category
       , sub_category
       , SUM(sales) AS sales_sub_category
  FROM records
  GROUP BY category, sub_category
), main AS (
  SELECT category
       , SUM(sales) AS sales_category
  FROM records
  GROUP BY category
), tot AS (
  SELECT sum(sales) AS sales_total
  FROM records
)

SELECT sub.category
     , sub.sub_category
     , ROUND(sub.sales_sub_category, 2) AS sales_sub_category
     , ROUND(main.sales_category, 2) AS sales_category
     , ROUND(tot.sales_total, 2) AS sales_total
     , ROUND(sub.sales_sub_category*100/main.sales_category, 2) AS pct_in_category
     , ROUND(sub.sales_sub_category*100/tot.sales_total, 2) AS pct_in_total
FROM sub 
LEFT JOIN main ON sub.category = main.category
CROSS JOIN tot

 

1. CTE 생성

-- (1) 서브카테별 매출액 합계 계산 -> sub

-- (2) 카테별 매출액 합계 계산 -> main

-- (3) 전체 매출액 합계 계산 -> tot

2. 위에서 만든 세개의 결과를 JOIN하여 모두 연결

3. 비율 계산