2017-10-18 87 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表中的第一个日期是2017年4月1日(其正确对应FirstFCDate列在表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

詹姆斯,

您可能会发现它有助于建立一个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) 

最亲切的问候......