在上一篇文章中讲了如何计算 周权重指数、日权重指数,看着有点抽象,下面通过SQL来实现计算过程。
销售明细数据 为2017年到天的销售数据,如下图:
周权重指数的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 :
日权重指数的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
运行结果: