您现在的位置是:首页分享心得 > SQL如图计算周数据加权平均统计网站首页分享心得

SQL如图计算周数据加权平均统计

2022-09-26 14:50:31599人围观
简介SQL如图计算周数据加权平均统计


create table 按周统计 (日期 date,
客户a实际到货量 int,客户a需求量 int,
客户b实际到货量 int,客户b需求量 int,
客户c实际到货量 int,客户c需求量 int,
客户a价格 int,客户b价格 int,客户c价格 int);

测试数据:


insert into 按周统计 values ('2021/8/21',1125,2500,8400,8000,2400,5000,3500,4600,5400);
insert into 按周统计 values ('2021/8/22',1125,2500,8400,8000,2400,5000,3500,4600,5400);
insert into 按周统计 values ('2021/8/23',1125,2500,8400,8000,2400,5000,3500,4600,5400);
insert into 按周统计 values ('2021/8/24',1125,2500,8400,8000,2400,5000,3500,4600,5400);
insert into 按周统计 values ('2021/8/25',1125,2500,8400,8000,2400,5000,3500,4600,5400);
insert into 按周统计 values ('2021/8/26',1125,2500,8400,8000,2400,5000,3500,4600,5400);
insert into 按周统计 values ('2021/8/27',1125,2500,8400,8000,2400,5000,3500,4600,5400);
insert into 按周统计 values ('2021/8/28',1125,2500,8400,8000,2400,5000,3500,4600,5400);
insert into 按周统计 values ('2021/8/29',1125,2500,8400,8000,2400,5000,3500,4600,5400);
insert into 按周统计 values ('2022/8/19',1125,2500,8400,8000,2400,5000,3500,4600,5400);
insert into 按周统计 values ('2022/8/20',1125,2500,8400,8000,2400,5000,3500,4600,5400);
insert into 按周统计 values ('2022/8/21',1125,2500,8400,8000,2400,5000,3500,4600,5400);
insert into 按周统计 values ('2022/8/22',1125,2500,8400,8000,2400,5000,3500,4600,5400);
insert into 按周统计 values ('2022/8/23',1125,2500,8400,8000,2400,5000,3500,4600,5400);
insert into 按周统计 values ('2022/8/24',1125,2500,8400,8000,2400,5000,3500,4600,5400);
insert into 按周统计 values ('2022/8/25',1125,2500,8400,8000,2400,5000,3500,4600,5400);

sql语句如下:


SET DATEFIRST 1;select max(日期) 数据库日期, datepart(wk,日期) as 第几周,DATEADD(dd, 7-datepart(WEEKDAY,max(日期)),max(日期) ) as 周日所在日期,sum(客户a实际到货量)/7 客户a周平均到货量,sum(客户a需求量)/7 客户a周平均需求量,
sum(客户a实际到货量*客户a价格)/sum(客户a实际到货量) 客户a加权平均价,
sum(客户b实际到货量)/7 客户b周平均到货量,
sum(客户b需求量)/7 客户b周平均需求量,
sum(客户b实际到货量*客户b价格)/sum(客户b实际到货量) 客户b加权平均价,
sum(客户c实际到货量)/7 客户c周平均到货量,
sum(客户c需求量)/7 客户c周平均需求量,
sum(客户c实际到货量*客户c价格)/sum(客户c实际到货量) 客户c加权平均价
from 按周统计 t group by DATEPART(yyyy,日期),datepart(wk,日期) order by max(日期);

结果如下:

上面的语句还是有BUG,如果碰到一周的日期刚好是跨年的就有问题了,比如 2021/12/31 和 2022/1/2 都是 2022/1/2周日这周的,那么用上面的语句,会得到2行数据,如下:


要解决这个BUG,应该用如下语句:


SET DATEFIRST 1;select max(日期), datepart(wk,max(日期)) as 第几周,DATEADD(dd, 7-datepart(WEEKDAY,max(日期)),max(日期) ) as 周日所在日期,sum(客户a实际到货量)/7 客户a周平均到货量,sum(客户a需求量)/7 客户a周平均需求量,
sum(客户a实际到货量*客户a价格)/sum(客户a实际到货量) 客户a加权平均价,
sum(客户b实际到货量)/7 客户b周平均到货量,
sum(客户b需求量)/7 客户b周平均需求量,
sum(客户b实际到货量*客户b价格)/sum(客户b实际到货量) 客户b加权平均价,
sum(客户c实际到货量)/7 客户c周平均到货量,
sum(客户c需求量)/7 客户c周平均需求量,
sum(客户c实际到货量*客户c价格)/sum(客户c实际到货量) 客户c加权平均价
from 按周统计 t group by DATEADD(dd, 7-datepart(WEEKDAY,日期),日期 ) order by max(日期);
 

结果如下:

文章评论