当前和上一年的周范围组数据
Data with group of week Ranges for current and previous year
我有一个 table,其中包含当年和上一年的数据。 table 中的单个记录代表一年中每一天发生的每笔交易。每个日期可以有多条记录。
我还在 SSRS 仪表板报告中显示与此 table 相关的数据。从该报告中传递了两个参数@StartDate 和@EndDate。
我需要编写一个接受@StartDate 和@EndDate 参数的SQL 服务器存储过程。
我在这里面临的挑战是,根据报告的结束日期,我需要获取当年前 8 周的数据。此外,相同日期范围的前一年数据在 SSRS 图表上显示为每周细分比较。
例如,如果我报告的结束日期是 2016 年 9 月 21 日,我需要获取前 8 周范围内的数据,即(9/15-9/21,9/8-9/14, 9/1-9/7 等等,直到 7/28-8/3。)我还需要获取前一年相同日期范围内的数据。
我还必须在 SSRS 报告端的图表的 X 轴上显示周日期范围。
如果我可以提供更多详细信息,请告诉我。
谢谢。
如果有帮助,我会使用 UDF 生成动态日期范围。计数甚至日期 table 都可以达到目的。
Declare @Date2 Date = GetDate()
Declare @Date1 Date = DateAdd(DAY,-49,@Date2)
Select DateR1=Cast(RetVal as Date)
,DateR2=Cast(DateAdd(DAY,6,RetVal) as Date)
From [dbo].[udf-Create-Range-Date](@Date1,@Date2,'WK',1)
Order By 1
Returns
DateR1 DateR2
2016-08-03 2016-08-09
2016-08-10 2016-08-16
2016-08-17 2016-08-23
2016-08-24 2016-08-30
2016-08-31 2016-09-06
2016-09-07 2016-09-13
2016-09-14 2016-09-20
2016-09-21 2016-09-27
UDF(如果需要)
CREATE FUNCTION [dbo].[udf-Create-Range-Date] (@DateFrom datetime,@DateTo datetime,@DatePart varchar(10),@Incr int)
Returns
@ReturnVal Table (RetVal datetime)
As
Begin
With DateTable As (
Select DateFrom = @DateFrom
Union All
Select Case @DatePart
When 'YY' then DateAdd(YY, @Incr, df.dateFrom)
When 'QQ' then DateAdd(QQ, @Incr, df.dateFrom)
When 'MM' then DateAdd(MM, @Incr, df.dateFrom)
When 'WK' then DateAdd(WK, @Incr, df.dateFrom)
When 'DD' then DateAdd(DD, @Incr, df.dateFrom)
When 'HH' then DateAdd(HH, @Incr, df.dateFrom)
When 'MI' then DateAdd(MI, @Incr, df.dateFrom)
When 'SS' then DateAdd(SS, @Incr, df.dateFrom)
End
From DateTable DF
Where DF.DateFrom < @DateTo
)
Insert into @ReturnVal(RetVal) Select DateFrom From DateTable option (maxrecursion 32767)
Return
End
-- Syntax Select * from [dbo].[udf-Create-Range-Date]('2016-10-01','2020-10-01','YY',1)
-- Syntax Select * from [dbo].[udf-Create-Range-Date]('2016-10-01','2020-10-01','DD',1)
-- Syntax Select * from [dbo].[udf-Create-Range-Date]('2016-10-01','2016-10-31','MI',15)
-- Syntax Select * from [dbo].[udf-Create-Range-Date]('2016-10-01','2016-10-02','SS',1)
EDIT - Sample via Join
Select D.DateR1
,D.DateR2
,TotalSales = sum(S.Sales)
From MySalesData S
Join (
Select DateR1=Cast(RetVal as Date)
,DateR2=Cast(DateAdd(DAY,6,RetVal) as Date)
From [dbo].[udf-Create-Range-Date](@Date1,@Date2,'WK',1)
) D
on S.Date Between D.DateR1 and D.DateR2
我有一个 table,其中包含当年和上一年的数据。 table 中的单个记录代表一年中每一天发生的每笔交易。每个日期可以有多条记录。
我还在 SSRS 仪表板报告中显示与此 table 相关的数据。从该报告中传递了两个参数@StartDate 和@EndDate。 我需要编写一个接受@StartDate 和@EndDate 参数的SQL 服务器存储过程。
我在这里面临的挑战是,根据报告的结束日期,我需要获取当年前 8 周的数据。此外,相同日期范围的前一年数据在 SSRS 图表上显示为每周细分比较。
例如,如果我报告的结束日期是 2016 年 9 月 21 日,我需要获取前 8 周范围内的数据,即(9/15-9/21,9/8-9/14, 9/1-9/7 等等,直到 7/28-8/3。)我还需要获取前一年相同日期范围内的数据。
我还必须在 SSRS 报告端的图表的 X 轴上显示周日期范围。
如果我可以提供更多详细信息,请告诉我。 谢谢。
如果有帮助,我会使用 UDF 生成动态日期范围。计数甚至日期 table 都可以达到目的。
Declare @Date2 Date = GetDate()
Declare @Date1 Date = DateAdd(DAY,-49,@Date2)
Select DateR1=Cast(RetVal as Date)
,DateR2=Cast(DateAdd(DAY,6,RetVal) as Date)
From [dbo].[udf-Create-Range-Date](@Date1,@Date2,'WK',1)
Order By 1
Returns
DateR1 DateR2
2016-08-03 2016-08-09
2016-08-10 2016-08-16
2016-08-17 2016-08-23
2016-08-24 2016-08-30
2016-08-31 2016-09-06
2016-09-07 2016-09-13
2016-09-14 2016-09-20
2016-09-21 2016-09-27
UDF(如果需要)
CREATE FUNCTION [dbo].[udf-Create-Range-Date] (@DateFrom datetime,@DateTo datetime,@DatePart varchar(10),@Incr int)
Returns
@ReturnVal Table (RetVal datetime)
As
Begin
With DateTable As (
Select DateFrom = @DateFrom
Union All
Select Case @DatePart
When 'YY' then DateAdd(YY, @Incr, df.dateFrom)
When 'QQ' then DateAdd(QQ, @Incr, df.dateFrom)
When 'MM' then DateAdd(MM, @Incr, df.dateFrom)
When 'WK' then DateAdd(WK, @Incr, df.dateFrom)
When 'DD' then DateAdd(DD, @Incr, df.dateFrom)
When 'HH' then DateAdd(HH, @Incr, df.dateFrom)
When 'MI' then DateAdd(MI, @Incr, df.dateFrom)
When 'SS' then DateAdd(SS, @Incr, df.dateFrom)
End
From DateTable DF
Where DF.DateFrom < @DateTo
)
Insert into @ReturnVal(RetVal) Select DateFrom From DateTable option (maxrecursion 32767)
Return
End
-- Syntax Select * from [dbo].[udf-Create-Range-Date]('2016-10-01','2020-10-01','YY',1)
-- Syntax Select * from [dbo].[udf-Create-Range-Date]('2016-10-01','2020-10-01','DD',1)
-- Syntax Select * from [dbo].[udf-Create-Range-Date]('2016-10-01','2016-10-31','MI',15)
-- Syntax Select * from [dbo].[udf-Create-Range-Date]('2016-10-01','2016-10-02','SS',1)
EDIT - Sample via Join
Select D.DateR1
,D.DateR2
,TotalSales = sum(S.Sales)
From MySalesData S
Join (
Select DateR1=Cast(RetVal as Date)
,DateR2=Cast(DateAdd(DAY,6,RetVal) as Date)
From [dbo].[udf-Create-Range-Date](@Date1,@Date2,'WK',1)
) D
on S.Date Between D.DateR1 and D.DateR2