난이도 | 풀기 | 문제 이름 |
난이도 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. 비율 계산

'데이터 처리 도구 > SQL 연습 기록' 카테고리의 다른 글
DAY 25 / [solvesql] 연습문제 1개 풀기 (세션 재정의하기) (0) | 2025.06.12 |
---|---|
DAY 24 / [solvesql] 연습문제 2개 풀기 (0) | 2025.06.11 |
DAY 22 / [solvesql] 연습문제 6개 풀기 (0) | 2025.06.09 |
DAY 21 / [solvesql] 연습문제 1개 풀기 (0) | 2025.06.07 |
DAY 19 / [solvesql] 연습문제 8개 풀기 (0) | 2025.06.03 |