2016-09-21 44 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。我會進一步研究並讓你知道。當然。如果我需要進一步的幫助,請告訴我們。 乾杯。 –