[데이터분석을 위한 SQL 레시피] 10강

june·2023년 5월 6일
0

SQL

목록 보기
26/31

4장 매출을 파악하기 위한 데이터 추출

10강 다면적인 축을 사용해 데이터 집약하기

카테고리별 매출과 소계 계산하기

코드 10-1

WITH sub_category_amount AS (
	-- 소 카테고리 매출 집계
	SELECT category
		 , sub_category
		 , SUM(price) AS amount
	FROM purchase_detail_log
	GROUP BY category, sub_category
)
, category_amount AS (
	-- 대 카테고리 매출 집계
	SELECT category
		 , 'all' AS sub_category
		 , SUM(price) AS amount
	FROM purchase_detail_log
	GROUP BY category
)
, total_amount AS (
	-- 전체 매출 집계
	SELECT 'all' AS category
		 , 'all' AS sub_category
		 , SUM(price) AS amount
	FROM purchase_detail_log
)
SELECT category, sub_category, amount
FROM sub_category_amount
UNION ALL
SELECT category, sub_category, amount
FROM category_amount
UNION ALL
SELECT category, sub_category, amount
FROM total_amount

그런데 UNION ALL을 사용한 결합방법은 성능이 좋지 않다.
ROLLUP을 사용해 쉽고 성능 좋은 쿼리 만들 수 있다.

코드 10-2

SELECT COALESCE(category, 'all') AS category
	 , COALESCE(sub_category, 'all') AS sub_category
	 , SUM(price) AS amount
FROM purchase_detail_log
GROUP BY ROLLUP(category, sub_category)
categorysub_categoryamount
allall861100
ladys_fashionbag127900
foodfish32000
foodmeats48700
dvddocumentary32800
mens_fashionjacket116300
bookbusiness53500
outdoorcamp28600
gameaccessories26000
ladys_fashionjacket369500
cdclassic25800
gameall26000
bookall53500
ladys_fashionall497400
outdoorall28600
mens_fashionall116300
cdall25800
dvdall32800
foodall80700

ROLLUP : GROUP BY 절에 사용되는 집계 함수 (링크)
COALESCE : null이 아닌 첫 번째 인수를 반환 (링크)

ABC 분석으로 잘 팔리는 상품 판별하기

코드 10-3

WITH monthly_sales AS (
	 SELECT category
	 		-- 항목별 매출 계산
	 	  , SUM(price) AS amount
	 FROM purchase_detail_log
	 -- 대상 1개월 동안의 로그를 조건으로 걸기
	 -- WHERE dt BETWEEN '2015-12-01' AND '2015-12-31'
	 GROUP BY category
)
, sales_composition_ratio AS (
	SELECT category
		 , amount
		 -- 구성비
		 , 100.0 * amount / SUM(amount) OVER() AS composition_ratio
		 -- 구성비 누계
		 , 100.0 * SUM(amount) OVER(ORDER BY amount DESC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) 
           / SUM(amount) OVER() AS cumulative_ratio
	FROM monthly_sales
)
SELECT *
       -- 구성비누계 범위에 따라 순위 붙이기 
     , CASE
     	WHEN cumulative_ratio BETWEEN 0 AND 70 THEN 'A'
     	WHEN cumulative_ratio BETWEEN 70 AND 90 THEN 'B'
     	WHEN cumulative_ratio BETWEEN 90 AND 100 THEN 'C'
     END AS abc_rank
FROM sales_composition_ratio
ORDER BY amount DESC
categoryamountcomposition_ratiocumulative_ratioabc_rank
ladys_fashion99480057.763325978399721357.7633259783997213A
mens_fashion23260013.505980722331901171.2693067007316223B
food1614009.371733828823597780.6410405295552201B
book1070006.212983393334107586.8540239228893276B
dvd656003.809081407502032390.6631053303913599C
outdoor572003.321333178492625793.9844385088839856C
game520003.019393798629659797.0038323075136453C
cd516002.9961676924863547100.0000000000000000C

팬 차트로 상품의 매출 증가율 확인하기

profile
나의 계절은

0개의 댓글