2016-09-21 21 views
1

現在の年および前年のデータを持つ表があります。この表の個々のレコードは、その年の各日に行われた各トランザクションを表しています。各日付に複数のレコードが存在する可能性があります。週のデータ現在および前年度の範囲

この表に関連するデータもSSRSダッシュボードレポートに表示しています。 @StartDateと@EndDateの2つのパラメータがこのレポートから渡されます。 @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週)と別のプロシージャまたはこれらの日付を求めて、1年を差し引いて同じ日付を尋ねるコードを呼び出すコードを払う(昨年) – 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) 

EDIT必要に応じて - 参加

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 
01を経由してサンプルを
+0

これは良いアイデアのように思えます。おそらく私はあなたの関数から得られたこの結果を必要な値を得るためにテーブルに加えることができます。 しかし、私はSQL Server 2005を持っていて、テーブルタイプのパラメータをサポートしていません(UDFはテーブルタイプを返します)。 本当にありがとうございます。それは間違いなく私をある方向に導いてくれます。 –

+1

@ KashyapMNVLそれはしばらくしていますが、2005年はCTEと表価値関数の両方をサポートしていると思います。私は、DateR1とDateR2の間のSomeDateの結合の一部として関数の結果を使用する傾向があります。私がさらに助けることができるかどうか私に知らせてください。 –

+0

CTEをサポートしていることは確かです。私はさらにそれを調べ、あなたに知らせます。確実なこと。それ以上の助けが必要な場合はお知らせします。 乾杯。 –

関連する問題