2013-04-26 56 views
-1

我有一个SQL脚本返回这个派生表。添加加入缺少的行

MM/YYYY Cat Score 
02/2012 Test1 19 
04/2012 Test1 15 
05/2012 Test1 16 
07/2012 Test1 14 
08/2012 Test1 15 
09/2012 Test1 15 
12/2012 Test1 11 
02/2012 Test2 15 
03/2012 Test2 13 
05/2012 Test2 18 
06/2012 Test2 14 
08/2012 Test2 15 
09/2012 Test2 14 
12/2012 Test2 10 

正如你所看到的,我错过了一些MM/YYYYs(03/2012,06/2012,二千零十二分之十一等)。

我想用Cat &填写缺失的MM/YYYY,得到0(零)。我知道开始日期(1/2012)应该是什么。

我试图加入一个包含所有MM/YYYY的查询将运行的范围的表,但这只会返回第一次出现的缺失行,它不会为每个Cat重复(应该已知那)。

所以我的问题是这样的,我可以使用连接来做到这一点,或者我必须在临时表中执行此操作,然后输出数据。我期待在2012年1月至2012年12月期间返回一张有24行的表格,其中适当的Cat(Test1 & Test2)&对应分数(如果存在)或者如果不存在则为零原始表。

AHIGA,LarryR ...

+0

你是如何加入你的餐桌的日期? – a1ex07 2013-04-26 16:55:17

+0

你有单独的类别表吗?你可以发布你的查询中使用的所有表来返回结果吗? – 2013-04-26 17:03:36

回答

3

这里是你如何使用一些热膨胀系数,让你所追求的一个例子。这使用三个CTE:一个用于所有日期,一个用于您的类别,然后是第三个用于交叉加入它们。第三个实际上是多余的,但它只是使我们看到的更加明显。

DECLARE 
    @StartDate datetime = '2/1/2012' 
    ,@EndDate datetime = '4/26/2013' 
;WITH DATES AS 
(
    SELECT 
     CAST(MONTH(@StartDate) as varchar(20)) + '/' + CAST(YEAR(@StartDate) as varchar(20)) 'CurrMonth' 
     ,@StartDate as Datefield 
    UNION ALL 
    SELECT 
     CAST(MONTH(CurrDate) as varchar(20)) + '/' + CAST(YEAR(CurrDate) as varchar(20)) 
     ,CurrDate 
    FROM 
     DATES 
    CROSS APPLY (SELECT DATEADD(month, 1, Datefield)) CxA(CurrDate) 
    WHERE CurrDate < @EndDate 
) 
,CATS AS 
(
    SELECT 'Test1' as 'Cat' 
    UNION ALL 
    SELECT 'Test2' 
) 
,AllTheThings AS 
(
    SELECT 
     Datefield 
     ,CurrMonth 
     ,Cat 
    FROM 
     DATES D 
    CROSS JOIN 
     CATS C 
) 

SELECT * FROM AllTheThings 
+0

感谢一百万人。这是做的伎俩! – larryr 2013-04-29 00:05:33

0

最好的解决方案是创建一个日期表(在临时表)。它只需要很小的空间。

+0

加入日期表时,只有一个丢失日期发生并且Cat为NULL。 – larryr 2013-04-26 17:00:29

+0

@larryr我不关注。 – Kermit 2013-04-26 17:02:29

+0

如果我加入日期表,缺失的日期将只出现一次,Cat col将为NULL。 – larryr 2013-04-26 17:20:42

2

如果我understodd正确,你会加入你的表像这样

SELECT 
    d.Date,c.Cat,ISNULL(t.Score,0) As Score 
FROM YourDateTable d 
CROSS JOIN 
(-- Your Cat Table or UNION Cat here 
    SELECT 'Test1' AS Cat 
    UNION ALL 
    SELECT 'Test2' 
) c 
LEFT JOIN YourCurrentTable t 
    ON t.Date = d.Date 
    AND t.Cat = c.Cat