2014-10-08 74 views
-3

我在臨時表中有一組值,我想用它來填充三個新列(在下面的MAX(CASE ... END)語句中)。在有序集合中返回NULL值

但是,我發現有時列1(或列1和列2)將包含NULL值,即使列3有一個值。

我想爲任何NULL值出現其它值,例如,Col1中=值,Col2中=值,COL3 = NULL

源代碼:

SELECT 
    mc.ID 
    ,mc.Date 
    ,max(case when sv1.row_num = 1 and mc.Date = sv1.Date then sv1.[Col] end) as Col1 
    ,max(case when sv1.row_num = 2 and mc.Date = sv1.Date then sv1.[Col] end) as Col2 
    ,max(case when sv1.row_num = 3 and mc.Date = sv1.Date then sv1.[Col] end) as Col3 
INTO #Total7 
FROM 
    #MyTable3 as mc 
    join 
     (
     select 
      #MyTable3.*, 
      row_number() OVER (PARTITION BY [ID] ORDER BY [Date]) as row_num 
     from #MyTable3 
    )as sv1 on 
     mc.ID = sv1.ID 
GROUP BY 
    mc.ID 
    ,mc.Date 

SELECT * 
FROM #Total7 
ORDER BY ID, Date 
+0

你是什麼意思'NULL'應該永遠不會進行值? – Zane 2014-10-08 13:52:11

+0

null應該永遠不會在值之前? – pancho018 2014-10-08 13:55:08

+0

也許COALESCE? – Max 2014-10-08 13:55:46

回答

0

你值顯示出來的順序,因爲NULL is always the first value returned by an ORDER BY,這也是您使用的是ROW_NUMBER()功能中的哪些您記錄進行排序(確定值是否在Col1中,col2的歸屬,或Col3)。您的查詢更改爲:

SELECT 
    mc.ID 
    ,mc.Date 
    ,max(case when sv1.row_num = 1 and mc.Date = sv1.Date then sv1.[Col] end) as Col1 
    ,max(case when sv1.row_num = 2 and mc.Date = sv1.Date then sv1.[Col] end) as Col2 
    ,max(case when sv1.row_num = 3 and mc.Date = sv1.Date then sv1.[Col] end) as Col3 
INTO #Total7 
FROM 
    #MyTable3 as mc 
    join 
     (
     select 
      #MyTable3.*, 
      ROW_NUMBER() OVER (PARTITION BY [ID] ORDER BY ISNULL([Date], '12/31/9999')) as row_num 
     from #MyTable3 
    )as sv1 on 
     mc.ID = sv1.ID 
GROUP BY 
    mc.ID 
    ,mc.Date 

SELECT * 
FROM #Total7 
ORDER BY ID, Date 

ISNULL()功能,如果[Date]字段爲空,返回而不是爲遙遠的未來的日期。因此,任何「真實」日期都會顯示第一行數值,並且任何日期都會顯示在最後。

或者,如果你不喜歡ISNULL(),你可以使用一個CASE聲明,即

ROW_NUMBER() OVER 
     (
     PARTITION BY [ID] 
     ORDER BY 
      CASE WHEN [Date] IS NULL THEN 1 ELSE 0 END, 
      [Date] 
    ) as row_num 
+0

沒有工作。沒有空日期。這個問題似乎出現在具有相同ID但具有不同日期的2個或更多記錄中。有用嗎? – Kello 2014-10-08 15:36:44

+0

如果ID有超過三個實際日期,那麼是的,我希望看到沒有NULL值。 – AHiggins 2014-10-08 15:41:54

0

日期加到你的連接查詢。

 SELECT 
     mc.ID 
     ,mc.Date 
     ,max(case when sv1.row_num = 1 and mc.Date = sv1.Date then sv1.[Col] end) as Col1 
     ,max(case when sv1.row_num = 2 and mc.Date = sv1.Date then sv1.[Col] end) as Col2 
     ,max(case when sv1.row_num = 3 and mc.Date = sv1.Date then sv1.[Col] end) as Col3 
    INTO #Total7 
    FROM 
     #MyTable3 as mc 
     join 
      (
      select 
       #MyTable3.*, 
       row_number() OVER (PARTITION BY [ID] ORDER BY [Date]) as row_num 
      from #MyTable3 
     )as sv1 on 
      mc.ID = sv1.ID 
      and mc.Date = sv1.Date 
    GROUP BY 
     mc.ID 
     ,mc.Date 

    SELECT * 
    FROM #Total7 
    ORDER BY ID, Date