sql按月份分组_零售密码之周权重指数、日权重指数的SQL实现

在上一篇文章中讲了如何计算 周权重指数、日权重指数,看着有点抽象,下面通过SQL来实现计算过程。

销售明细数据 为2017年到天的销售数据,如下图:

b084c91e292a2c7a6aba17ffa1ba9f1e.png

周权重指数的SQL实现

这里假设不考虑节假日等特殊日期的影响,只按照基本的星期1-7规律来处理数据。

计算周权重指数需要用1整年的销售数据,按照全年的星期N来求平均销售额。

SQL实现的具体代码如下:

set datefirst 1  --设置星期一为一周的第1天

--select datepart(weekday,getdate()),@@DATEFIRST

;with t
as
(
select * from 销售明细
),

tSum1
as
(
select 销售日期,sum([销售额]) 销售额
from t
where 销售日期 >='2017-01-01' and 销售日期<'2018-01-01'
group by 销售日期
),

tSum2
as
(
select 
    * ,
	datepart(weekday,销售日期) 星期N
from tSum1
),

tSum3
as
(
select 
    *,
	sum(销售额) over(partition by 星期N) s,
	count(*) over(partition by 星期N) c
from tSum2
),

销售汇总表
as
(
select 
    *,
	s / c 星期N的平均销售,
	s / c / min(s / c) over(partition by 1) 星期N的系数,
	row_number() over(partition by 星期N order by 销售日期) rn
from tSum3
)

select 
    *,
	sum(case when rn = 1 then 星期N的系数 else 0 end) over(partition by 1) 周权重指数
from 销售汇总表


运行结果如下图,周权重指数为 10.424436 :

6937c3ec3b54049925bce1c3a3876509.png

日权重指数的SQL实现

日权重指数是对公司分部销售数据,按单个月计算出的指数,所以代码中都会按照月份来分组计算。

代码如下:

set datefirst 1  --星期N一是第1天

--select datepart(weekday,getdate()),@@DATEFIRST

;with t
as
(
select * from 销售明细
),

tSum1
as
(
select 销售日期,sum([销售额]) 销售额
from t
group by 销售日期
),

tSum2
as
(
select 
    * ,
	datepart(weekday,销售日期) 星期N, 
	month(销售日期) 月份,
	ltrim(month(销售日期)) + ltrim(datepart(weekday,销售日期)) 月份星期N
from tSum1
),

tSum3
as
(
select 
    *,
	sum(销售额) over(partition by 月份星期N) s,
	count(*) over(partition by 月份星期N) c
from tSum2
),

销售汇总表
as
(
select 
    *,
	s / c 月份星期N的平均销售,
	s / c / min(s / c) over(partition by 月份) 月份星期N的系数,
	row_number() over(partition by 月份,星期N order by 销售日期) rn
from tSum3
--order by 1
)--,

select
    *,
	月份星期N的平均销售 / 平均周销售 * 周权重指数 as 日权重指数
from 
(
select 
    *,
	10.424436 周权重指数,
	sum(case when rn = 1 then 月份星期N的平均销售 else 0 end) over(partition by 月份) 平均周销售
from 销售汇总表
)r

运行结果:

6779ca23eecb422d9faef538643cdd2a.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值