2016-09-21 56 views
1

我有一个表格,其中包含当年和上年的数据。此表中的个人记录代表每年发生的每笔交易。每个日期可以有多个记录。本周和上一年的分组数据

我还在SSRS仪表板报告中显示与此表相关的数据。从此报告传递两个参数@StartDate和@EndDate。 我需要编写一个接受@StartDate和@EndDate参数的SQL Server存储过程。

我在这里面临的挑战是,根据报告的结束日期,我需要获得本年度前8周的数据。此外,来自同一日期的上一年的数据范围和显示就像SSRS图表上的每周分解比较。

例如,如果我的报告的结束日期是2016-09-21,我需要获取之前8周范围的数据,即(9/15-9/21,9/8-9/14,9/1-9/7等等,高达7/28-8/3)。我还需要获取前一年相同日期范围内的数据。

我还必须在SSRS报表侧的图表的X轴上显示星期日期范围。

请让我知道,如果我可以从我的最后提供任何进一步的细节。 谢谢。

+0

我假设你只是要求Tsql的帮助,而事实上SSRS只是次要的问题。首先,如果你知道你需要从结束日期开始的8周数据,那么听起来好像不需要开始日期。请考虑将开始日期发送到8周之前,然后您的存储过程不必被硬编码为“返回”8周。或者考虑结束日期和周数作为输入参数返回。 – paulbarbin

+0

此外,我只是在读,你需要与前一年相同的8周会议。我仍然会考虑一个程序,该程序返回给定开始和结束(或结束减去8周)的数据和另一个过程,或者只是调用处理要求这些日期的代码,减去一年并要求相同的日期(去年) – paulbarbin

+0

这是我正在处理的仪表板报告,因此开始日期是我传递的用于获取报告中不同值的参数。当然,我们没有使用开始日期。 8周必须从结束日期参数本身考虑。 @paulbarbin –

回答

1

如果有帮助,我使用UDF来生成动态日期范围。一个理货,甚至一个日期表将会尽其所能。

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 

返回

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) 

编辑 - 通过样品加入

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 
+0

这听起来像个好主意。也许我可以加入从你的函数获得的结果与表中我必须得到所需的值。 但是,我有一个SQL Server 2005,我不支持表类型参数(UDF返回一个表类型)。 顺便欣赏你的想法。这肯定会让我走向某个方向。 –

+1

@KashyapMNVL这已经有一段时间了,但我相信2005支持CTE和表值函数。我倾向于将函数的结果用作DateR1和DateR2之间的SomeDate的联接的一部分。只要让我知道我是否可以进一步协助。 –

+0

它确实支持CTE。我会进一步研究并让你知道。当然。如果我需要进一步的帮助,请告诉我们。 干杯。 –