2017-11-29 8 views
0

月ジャンプのデータがある場所でこの問題が発生します。あなたが見ることができるように、Record Dateは常に一ヶ月ずつジャンプします。日付が停止したときにSQLのすべてのレコードの出力日付(1ヶ月間でなければなりません)

私は01/01/2017の新しい行を生成する必要があります。基本的には、月に1つのギャップがあるたびに新しい行を生成する必要があります。

どうすればいいですか?会計週は月のちょうど週、月はちょうど年、月はちょうど年です。週数は数年前に始まり、蓄積し続けているので、問題ではない特別な表で調べることができます。週、年、月を使い、minまたはmaxを使用します(最初またはその月の最後の週)

[Week Num] [Record Date] [Record Date] [Fiscal Year] [Fiscal Month] [Fiscal Week] [Customer #] [Group Description] 
158  01/10/2016 NULL   2016   10    41   12345  aDrive 
162  01/11/2016 NULL   2016   11    45   12345  aDrive 
166  01/12/2016 NULL   2016   12    49   12345  aDrive 

は基本的に私は10月、11月を生成する必要はありませんが、私はありません、その後の記録が、隙間なくどちらかが存在し、最後のレコードを生成したいです。

お手伝いします。

+0

SQL Server 2005 – ReportWarrior

+0

?私はあなたがここでやろうとしていることを理解することさえできません。 –

+0

"私は月間ジャンプのデータがある場所にこの問題があります。" Ok ...これをあなたのサンプルコードで説明してください。提供されていることははっきりしていません。 2015年1月12日以降にさらにデータが必要ですか? – Zorkolot

答えて

0

あなたの質問を理解しようとしました。 次のクエリを試してみてください。しかし、ここで再帰的なCTEを使用しているため、SQLServer 2005では動作しない可能性はあります。

DECLARE @ToDate date 
SET @ToDate='20171201' -- we'll calculate new rows until this date 

;WITH monthCTE AS(
    -- get the last row from your table 
    SELECT [Week Num],[Record Date],[Fiscal Year],[Fiscal Month],[Fiscal Week],[Customer #],[Group Description] 
    FROM 
    (
     SELECT TOP 1 * 
     FROM [Your data] 
     ORDER BY [Week Num] DESC 
    ) q 

    UNION ALL 

    -- calculate the next row 
    SELECT 
    [Week Num]+DATEDIFF(WEEK,[Record Date],[New Record Date]), 
    [New Record Date], 
    YEAR([New Record Date]), 
    MONTH([New Record Date]), 
    CASE 
     WHEN MONTH([New Record Date])=1 THEN 1 -- return 1 if it is the first month in the year 
     ELSE [Fiscal Week]+DATEDIFF(WEEK,[Record Date],[New Record Date]) 
    END, 
    [Customer #], 
    [Group Description] 
    FROM 
    (
     SELECT 
     [Week Num],[Record Date],[Fiscal Year],[Fiscal Month],[Fiscal Week],[Customer #],[Group Description], 
     DATEADD(MONTH,1,[Record Date]) [New Record Date] -- add one month to the previous date 
     FROM monthCTE 
     WHERE [Record Date]<@ToDate 
    ) q 
) 
SELECT [Week Num],[Record Date],[Fiscal Year],[Fiscal Month],[Fiscal Week],[Customer #],[Group Description] 
FROM [Your data] 

UNION -- this operation also exclude duplicate for the last row 

SELECT [Week Num],[Record Date],[Fiscal Year],[Fiscal Month],[Fiscal Week],[Customer #],[Group Description] 
FROM monthCTE 

ORDER BY [Week Num] 

は私が正しくあなたを理解している場合、それは、あなたが正確さのためにすべての式をチェックする必要があります動作します。

関連する問題