2014-12-04 90 views
0

這裏是什麼I'm做:顯示LastDateOfMonth即使是沒有價值

WITH cte AS (
    SELECT * FROM TimeDim 
) 
SELECT t.TimeDimPK, c.ID 
FROM CTE AS t 
LEFT OUTER JOIN TABLE c ON c.TimeDimFK = t.TimeDimPK 
ORDER BY t.TimeDimPK 
WHERE c.ID = 1 

的結果,這是缺少日期如下:

TimeDimPK ID 
20120930 1 
20121231 1 
20130131 1 

什麼我正嘗試獲得

TimeDimPK ID 
20120930 1 
20121031 NULL 
20121130 NULL 
20121231 1 
20130131 1 

回答

1

看起來你的WHERE條款正在擺脫其他日期。試試這個:

WITH cte 
      AS (SELECT TimedimPK 
       FROM  TimeDim 
      ) 
    SELECT t.TimeDimPK , 
      c.ID 
    FROM cte t 
      LEFT OUTER JOIN TABLEname c ON c.TimeDimFK = t.TimeDimPK 
    WHERE c.ID = 1 
      OR c.ID IS NULL 
    ORDER BY t.TimeDimPK 
+0

這不會爲我工作:( 我需要查詢生成,其中缺少的日期,同時使用一個ID的地方。 – AceAlfred 2014-12-04 16:24:25

+0

您需要提供更多描述性反饋,然後「這不適合我」。當你運行查詢時,缺少什麼? – 2014-12-04 16:32:08

+0

我需要查詢來生成丟失的日期,同時在特定的ID上使用where條件。 – AceAlfred 2014-12-05 09:52:02

0

您可以嘗試使用「數字/日期發生器」,這個查詢將在所有失蹤天填寫,然後選擇該月的最後一天。我不知道你的所有數據的細節,所以我現在給你兩個建議:

1 - 緊湊建議:

DECLARE @minDate DATETIME, @maxDate DATETIME; 

SELECT @minDate = MIN(TimeDimPK), @maxDate = MAX(TimeDimPK) FROM TimeDim; 

WITH DateGenerator AS 
(
    --Create a list with a lot of dates from @minDate 
    SELECT TimeDimPK = CONVERT(DATE, DATEADD(dd, ROW_NUMBER() OVER (ORDER BY OBJECT_ID), @minDate)) FROM sys.objects 
) 
--List all days, including missing days 
SELECT TimeDimPK 
, c.ID 
FROM DateGenerator n 
LEFT JOIN AnotherTable c ON c.TimeDimFK = n.TimeDimPK 
WHERE 
--Stop the number generator at the last day of the last month from the cte table 
n.TimeDimPK <= CONVERT(DATE, DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0, @maxDate)+1,0))) 
--This will get the last day of every month 
AND TimeDimPK = CONVERT(DATE, DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,TimeDimPK)+1,0))) 



2 - 建議你的CTE子句,如果你想用它進行一些調整:

WITH NumberGenerator AS 
(
    --Create a number list 1,2,3,4,5,6,7,8,++ 
    SELECT Number = ROW_NUMBER() OVER (ORDER BY OBJECT_ID) FROM sys.objects 
), cte AS (
    --Your cte query with a date number based on the days between the firts and current days 
    SELECT 
    TimeDimPK = CONVERT(DATETIME, TimeDimPK) 
    --Get the number of days to add from the first day in your table 
    , DateNumber = DATEDIFF(dd, MIN(TimeDimPK) OVER(), TimeDimPK) 
    FROM #TimeDim 
), TableWithMissingDates AS 
(
    --Fill missing days 
    SELECT TimeDimPK = CONVERT(DATE, DATEADD(dd, n.Number - 1, MIN(t.TimeDimPK) OVER())) 
    , c.ID 
    FROM NumberGenerator n 
    LEFT JOIN cte t ON t.DateNumber = n.Number 
    LEFT JOIN #Test2 c ON c.TimeDimFK = t.TimeDimPK 
    --Stop the number generator at the last day of the last month from the cte table 
    WHERE CONVERT(DATE, DATEADD(dd, n.Number - 1, (SELECT MIN(TimeDimPK) FROM cte))) < CONVERT(DATE, DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0, (SELECT MAX(TimeDimPK) FROM cte))+1,0))) 
) 
SELECT * FROM TableWithMissingDates 
WHERE 
--This will get the last day of every month 
TimeDimPK = CONVERT(DATE, DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,TimeDimPK)+1,0))) 



兩個查詢將返回相同的表:

enter image description here