2011-08-29 1 views
-1

2つの指定された日付の間に生成するレポートがありますが、作成された日付(現在の処理値と等しい)私はSQLが2つの値の間で選択したときの処理値を調べる

のように表示されるはずです2011年8月12日2011年8月15日までの間)、ここで参加

TranID OrderID Amount CreatedDate 
1   1  200 08/12/2011 
2   1  100 08/16/2011 

レポートを行う(2つの与えられた日付の)それを呼び出すために何を知りません

1  1 200 08/12/2011 
2  1 0 08/13/2011 
3  1 0 08/14/2011 
4  1 0 08/15/2011 

私は文の間に0を設定していないので、それは働かない選択の中で使用例文は使用できません。

質問に間違いがあります。

+3

"現在の処理値"はどこから来ていますか?私はあなたが望む結果で使用しているロジックを見ることができません。なぜ'08/13/2011'に0に設定された金額があるのですか。 –

+0

私は明らかに私は現在の処理値のために何を呼び出すべきかわかりません。もう一度説明しましょう。与えられた値の範囲と作成された日付の間の各日付と比較したいと思います。一致する場合は値を表示したい0 – Praneeth

+0

これは私の思うようなサンプルデータを編集したので、もう少し意味がありますが、目的の結果セットに4行ありませんか? –

答えて

2

以下のような結果を表示するには、まずCTEを使用して範囲内のすべての可能な日付を生成します。

Row Amount CreatedDate 
1 200 2011-08-12 
2 0 2011-08-13 
3 0 2011-08-14 
4 0 2011-08-15 


CREATE TABLE #temp(TranID INT, OrderID INT, Amount INT, CreatedDate date) 
INSERT INTO #temp (TranID, OrderID, Amount, CreatedDate) VALUES (1,1,200 ,'08/12/2011') 
INSERT INTO #temp (TranID, OrderID, Amount, CreatedDate) VALUES (2,1,100 ,'08/16/2011') 


DECLARE @startDate DATE ,@endDate DATE 
Select @startDate = '08/12/2011' , @endDate = '08/15/2011' 


;WITH Dates (CreatedDate, RowNumber) AS (
    /* Generating all possible dates in the range */ 
    SELECT @startDate AS CreatedDate, 1 AS RowNumber 
    UNION ALL 
    SELECT dateadd(d,1,CreatedDate), RowNumber+1 FROM dates WHERE CreatedDate < @endDate 
) 

SELECT RowNumber, Coalesce(sum(t.Amount),0) AS Amount, d.CreatedDate FROM Dates d 
LEFT OUTER JOIN #temp t 
ON d.CreatedDate = t.CreatedDate 
GROUP BY RowNumber,d.CreatedDate 
関連する問題