2017-10-18 11 views
2

私は、以下に示す表の結果クエリを持っている:TSQL - 欠落している日付を追加

select * from (select [iKey], [StartDate], [FirstFCDate] from (SELECT [iKey], min([Date]) as [FirstFCDate] from dbo.factFC group by [iKey]) as gp left outer join (select [StartDate], [Key] from dbo.iKeys) dw on gp.iKey = dw.[Key]) ft 

Table1 
iKey StartDate  FirstFCDate 
101  2017-01-13  2017-04-01 
52  2016-11-11  2017-04-01 
21  2017-02-23  2017-04-01 
19  2014-01-21  2017-05-01 
34  2016-08-18  2017-07-01 

私がやろうとしています何が私のファクトテーブル(dbo.factProdと呼ばれる別のテーブル)に行を挿入でそのテーブルには、開始日とFirstFCDateの間のすべての日付の行があります。現在、私のファクトテーブルは次のようになります

:あなたが見ることができるように

factProd 
ID  iKey Date   pAmount fcKey 
1  101  2017-04-01  123  1 
2  101  2017-04-01  456  2 
3  101  2017-04-02  789  1 
4  101  2017-04-02  103  2 
5  101  2017-04-03  192  1 
6  101  2017-04-03  112  2 

、のiKey 101のために、factProdテーブル上の最初の日付が正しくFirstFCDate列に対応2017年4月1日(あります表1)。

iKey + fcKeyの各組み合わせの2017-01-13(StartDate列から)までの各日付の行をこのfactProdテーブルに追加します。

だから、最終的な結果は、(IDが自動生成されます)、次のようになります。

factProd 
ID  iKey  Date   pAmount fcKey 
99  101  2017-01-13  0   1 
100 101  2017-01-13  0   2 
101 101  2017-01-14  0   1 
102 101  2017-01-14  0   2 
103 101  2017-01-15  0   1 
104 101  2017-01-15  0   2 
... ...  ...   ...  ... 
199 101  2017-03-31  0   1 
200 101  2017-03-31  0   2 

1  101  2017-04-01  123  1 
2  101  2017-04-01  456  2 
3  101  2017-04-02  789  1 
4  101  2017-04-02  103  2 
5  101  2017-04-03  192  1 
6  101  2017-04-03  112  2 

答えて

0

ジェームズ、

あなたはそれが役に立つ可能日付のすべてのための1つの行とのCTEテーブルを構築するために見つけることが範囲(つまり、ファクトテーブルのMINとMAXの日付)の間に移動し、LEFT JOINをクリックして不足している日付を見つけます。 LEFT JOIN、IS NULLロジックを使用して、あなたのファクトテーブルにINSERTINGを追加して、失われた日を追加することもできます。あなたのシナリオは、それだけではもう少し複雑ですが、それは良い道を導くかもしれません。ここでは、そのテーブルを構築するためのいくつかのコードは、事実上、次のとおりです。

DECLARE @FromDate datetime 
DECLARE @ToDate datetime 
SET @FromDate = '1/1/2017' 
SET @ToDate = '1/1/2018'; 
WITH DayTable AS (SELECT CAST(@FromDate AS DATETIME) AS theDate UNION ALL SELECT DATEADD(dd, 1, theDate) FROM DayTable s WHERE DATEADD(dd, 1, theDate) <= CAST(@ToDate AS DATETIME)) 
SELECT * FROM DayTable 
OPTION 
(MAXRECURSION 32767) 

親切よろしく...

関連する問題