想求出 按每周统计的话,计算出该表的数据 每一周,例如选取 - 周日 每7天的 客户X的一周7天内的【加权平均价格】 和 【简单平均到货量】。
结果例如(数据是虚拟的方便示意):
可以按下方数据以每周日为一周的结算条件,周日的日期为key
--创建测试数据
create table test_20220926 (日期 date,
客户a实际到货量 int,客户a需求量 int,
客户b实际到货量 int,客户b需求量 int,
客户c实际到货量 int,客户c需求量 int,
客户a价格 int,客户b价格 int,客户c价格 int);
insert into test_20220926 values ('2021/8/21',1125,2500,8400,8000,2400,5000,3500,4600,5400);
insert into test_20220926 values ('2021/8/22',1125,2500,8400,8000,2400,5000,3500,4600,5400);
insert into test_20220926 values ('2021/8/23',1125,2500,8400,8000,2400,5000,3500,4600,5400);
insert into test_20220926 values ('2021/8/24',1125,2500,8400,8000,2400,5000,3500,4600,5400);
insert into test_20220926 values ('2021/8/25',1125,2500,8400,8000,2400,5000,3500,4600,5400);
insert into test_20220926 values ('2021/8/26',1125,2500,8400,8000,2400,5000,3500,4600,5400);
insert into test_20220926 values ('2021/8/27',1125,2500,8400,8000,2400,5000,3500,4600,5400);
insert into test_20220926 values ('2021/8/28',1125,2500,8400,8000,2400,5000,3500,4600,5400);
insert into test_20220926 values ('2021/8/29',1125,2500,8400,8000,2400,5000,3500,4600,5400);
--确认当前设置的一周第一天是周几
select @@DATEFIRST;
--如果不是周一,则设置成周一
SET DATEFIRST 1;
--查询
select max(日期) 日期,
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 test_20220926 t group by datepart(wk,日期);
加权平均的公式麻烦可以说一下,现在处理成平均价格的话如下:
select max(datename(weekday, 日期)) as '日期',
avg(客户a实际到货量) as 客户a平均到货量, avg(客户a需求量) as 客户a需求量, avg(客户a价格) as 客户a平均价格,
avg(客户b实际到货量) as 客户b平均到货量, avg(客户b需求量) as 客户b需求量, avg(客户b价格) as 客户b平均价格,
avg(客户c实际到货量) as 客户c平均到货量, avg(客户c需求量) as 客户c需求量, avg(客户c价格) as 客户c平均价格
from 表
group by datename(week, 日期)
select DATEADD(dd, 7-(DATEPART(dw, 日期)), 日期), avg(客户a实际到货量) as 客户a周平均到货量 from orders group by DATEADD(dd, 7-(DATEPART(dw, 日期)), 日期);
select avg(客户a平均到货量) as 客户a平均到货量,datename(week,price_time) from table group by datename(week,price_time)
首先需要一个日期维度的基础表 ,脚本如下:
--1、创建数据表 T_Date
CREATE TABLE [dbo].[T_Date](
[the_date] [int] NOT NULL,
[date_name] [nvarchar](30) NULL,
[the_year] [int] NULL,
[year_name] [nvarchar](30) NULL,
[the_quarter] [int] NULL,
[quarter_name] [nvarchar](30) NULL,
[the_month] [int] NULL,
[month_name] [nvarchar](30) NULL,
[the_week] [int] NULL,
[week_name] [nvarchar](30) NULL,
[week_day] [int] NULL,
[week_day_name] [nvarchar](30) NULL,
CONSTRAINT [PK_T_Date] PRIMARY KEY CLUSTERED
(
[the_date] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
-- 2、创建生成日期的存储过程
GO
/****** Object: StoredProcedure [dbo].[SP_CREATE_TIME_DIMENSION] ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[SP_CREATE_TIME_DIMENSION]
@begin_date nvarchar(50)='2015-01-01' ,
@end_date nvarchar(50)='2030-12-31'
as
/*
SP_CREATE_TIME_DIMENSION: 生成时间维数据
begin_date: 开始时间
end_date:结束时间
*/
declare
@dDate date=convert(date,@begin_date),
@v_the_date varchar(10),
@v_the_year varchar(4),
@v_the_quarter varchar(2),
@v_the_month varchar(10),
@v_the_month2 varchar(2),
@v_the_week varchar(2),
@v_the_day varchar(10),
@v_the_day2 varchar(2),
@v_week_day nvarchar(10),
@adddays int=1;
WHILE (@dDate<=convert(date,@end_date))
begin
set @v_the_date=convert(char(10),@dDate,112);--key值格式为yyyyMMdd
set @v_the_year=DATEPART("YYYY",@dDate);--年份
set @v_the_quarter=DATEPART("QQ",@dDate);--季度
set @v_the_month=DATEPART("MM",@dDate);--月份(字符型)
set @v_the_day=DATEPART("dd",@dDate);--日(字符型)
set @v_the_week=DATEPART("WW",@dDate);--年的第几周
set @v_week_day=DATEPART("DW",@dDate); --星期几
-- 插入数据
insert into T_Date(the_date,date_name,the_year,year_name,the_quarter,quarter_name,the_month,month_name,the_week,week_name,week_day,week_day_name)
values(
@v_the_date,
convert(nvarchar(10),@v_the_year)+'年'+convert(nvarchar(10),@v_the_month)+'月'+convert(nvarchar(10),@v_the_day)+'日',
@v_the_year,
convert(nvarchar(10),@v_the_year)+'年',
@v_the_quarter,
convert(nvarchar(10),@v_the_year)+'年'+convert(nvarchar(10),@v_the_quarter)+'季度',
case when @v_the_month>=10 then
convert(int,(convert(nvarchar(10),@v_the_year)+convert(nvarchar(10),@v_the_month)))
else convert(int,convert(nvarchar(10),@v_the_year)+'0'+convert(nvarchar(10),@v_the_month)) end,
convert(nvarchar(10),@v_the_year)+'年'+convert(nvarchar(10),@v_the_month)+'月',
@v_the_week
,'第'+convert(nvarchar(10),@v_the_week)+'周',
@v_week_day,
case @v_week_day-1
when 1 then '星期一'
when 2 then '星期二'
when 3 then '星期三'
when 4 then '星期四'
when 5 then '星期五'
when 6 then '星期六'
when 0 then '星期日'
else '' end
);
set @dDate=dateadd(day,@adddays,@dDate);
continue
if @dDate=dateadd(day,-1,convert(date,@end_date))
break
end
-- 3、执行存储过程生成数据
GO
DECLARE @return_value int
EXEC @return_value = [dbo].[SP_CREATE_TIME_DIMENSION]
SELECT 'Return Value' = @return_value
GO
然后使用left join 进行数据表关联统计。
数据库技巧:整理SQLServer非常实用的脚本_IT技术分享社区的博客-CSDN博客_sqlserver 脚本
这个简单吧,就是按周统计,就是按周分组,这里要注意的一点就是,因为你数据库里不止一年的数据,所以除了按周,还需要按年的,不然你按周的话,不同年里,会有相同的周,楼上那些给的都有BUG,真正的应该是这样统计:
SET DATEFIRST 1;select max(日期) 日期, datepart(wk,日期) 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,日期);
测试数据:
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);
结果如下: