Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TSQL-添加缺少的日期_Tsql_Sql Server 2014_Recursive Query_Dateadd - Fatal编程技术网

TSQL-添加缺少的日期

TSQL-添加缺少的日期,tsql,sql-server-2014,recursive-query,dateadd,Tsql,Sql Server 2014,Recursive Query,Dateadd,我有一个查询,结果如下表所示: 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

我有一个查询,结果如下表所示:

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-04-01,它与表1中的FirstFCDate列正确对应

我想做的是为2017-01-13之间的每个日期从每个iKey+fcKey组合的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
詹姆斯

您可能会发现,为事实表中的所有可能日期(即最小日期和最大日期)构建一个包含一行的CTE表很有帮助,然后左键连接到该表以查找缺少的日期。您可能还想考虑使用LealEngin、NULL逻辑插入到事实表中,以获得丢失的日期。您的场景比这要复杂一些,但它可能会引导您走上一条好的道路。以下是构建该表的一些代码:

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)
最亲切的问候