【SQL語句】統計月度商品累計銷售量金額和銷售量


/*
統計月度商品累計銷售量金額和銷售量
樣本數為每月商品銷售記錄以及時間維度表

1)樣本分析:日期、商品ID、銷售金額、銷售量,且存在某月商品銷售記錄為空,
2)目標結果:日期、商品ID、累計銷售金額、累計銷售量
3)取數思路1:
1.1)先計算出中間表1(商品ID、日期、銷售金額、銷售量),然后按照窗口函數,計算結果
1.2)先補全數據,得出中間表1,
1.3)根據商品ID、時間ID關聯得出全量中間表2,再與商品銷售記錄進行關聯得出中間表3
取數思路2:
這里取數設置一個需求條件,即滿足每個商品生命周期內期間的統計,早過或者晚於這個周期不用統計。
1.1 統計每個產品每年的最后銷售月份,作為最大時間,作為商品銷售記錄的新信息,得表2
1.2 通過時間維度表與新表(表2)進行笛卡爾積關聯,保證時間在同一年,時間維度表的時間居於表2的銷售月份和該記錄的最大時間之間,

*/

----------------數據准備---------------
/*
創建商品銷售記錄表(month_end_sales_order_fact),錄入樣本數據
創建商品信息表、時間維度表
*/
USE sale_order;

DROP TABLE
IF EXISTS month_end_sales_order_fact;

CREATE TABLE month_end_sales_order_fact (
	order_year_sk INT COMMENT 'order year SK'
	,order_month_sk INT COMMENT 'order month SK'
	,product_sk INT COMMENT 'product SK'
	,month_order_amount DECIMAL (10, 2) COMMENT 'month order amount'
	,month_order_quantity INT COMMENT 'month order quantity'
);

INSERT INTO month_end_sales_order_fact
VALUES
	(2021,202101, 1001, 1.11, 1)
	,(2021,202103, 1001, 2.22, 1)
	,(2021,202104, 1002, 2.22, 1)
	,(2021,202105, 1003, 2.22, 1)
	,(2020,202001, 1001, 1.11, 1)
	,(2020,202003, 1001, 2.22, 1)
	,(2020,202004, 1002, 2.22, 1)
	,(2020,202005, 1003, 2.22, 1)
	,(2020,202001, 1004, 3.33, 1)
;

DROP TABLE
IF EXISTS product_sk;

CREATE TABLE product_sk (
	product_sk INT COMMENT 'product SK'
);

INSERT INTO product_sk
VALUES
	(1001)
	,(1002)
	,(1003)
	,(1004)
;
DROP TABLE
IF EXISTS month_dim;

CREATE TABLE month_dim (
	year_sk INT COMMENT 'year_id',
	month_sk INT COMMENT 'month_id'
);

INSERT INTO month_dim
VALUES
	(2021, 202101),
	(2021, 202102),
	(2021, 202103),
	(2021, 202104),
	(2021, 202105),
	(2020, 202001),
	(2020, 202002),
	(2020, 202003),
	(2020, 202004),
	(2020, 202005);

-- 計算月度商品銷售記錄的年度累計銷售情況(方法1)結果40條數據
select
	 a.year_sk
	,a.month_sk
	,a.product_sk
	,sum(IFNULL(c.month_order_amount ,0)) over (PARTITION by  a.year_sk, a.product_sk order by a.month_sk rows between unbounded preceding and current row     ) month_order_amount
	,sum(IFNULL(c.month_order_quantity ,0)) over (PARTITION by  a.year_sk,a.product_sk order by a.month_sk rows between unbounded preceding and current row     ) month_order_quantity
from  (select * from month_dim 
JOIN	product_sk )a
LEFT JOIN	month_end_sales_order_fact c
on 		c.order_month_sk = a.month_sk
and 	a.product_sk = c.product_sk
ORDER BY a.product_sk,a.month_sk
;

-- 計算月度商品銷售記錄的年度累計銷售情況(方法2)結果14條記錄
SELECT
	a.month_sk,
	b.product_sk,
	sum(b.month_order_amount) month_order_amount,
	sum(b.month_order_quantity) month_order_quantity
FROM
	month_dim a,
	(
		SELECT
			a.*, b.year_sk,
			b.month_sk,
			max(a.order_month_sk) over (PARTITION BY a.product_sk) max_month_sk
		FROM
			month_end_sales_order_fact a,
			month_dim b
		WHERE
			a.order_month_sk = b.month_sk
	) b
WHERE
a.month_sk <= b.max_month_sk
AND 
a.year_sk = b.year_sk
AND b.month_sk <= a.month_sk
GROUP BY
	a.month_sk,
	b.product_sk
ORDER BY 	
	b.product_sk asc ,a.month_sk ASC
;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM