2013-04-26 57 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