2014-10-08 3 views
-3

У меня есть набор значений в таблице temp, которую я хочу использовать для заполнения трех новых столбцов (в приведенном ниже примере 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

+0

null никогда не должен превышать значение? – pancho018

+0

Возможно COALESCE? – Max

ответ

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 

The ISNULL() функция будет, если [Date] поле равно нулю, вернуть вместо дату, которая далеко в будущее. Таким образом, любые «реальные» даты будут отображаться с первым значением номера строки, а любые даты NULL будут отображаться последними.

Или, если вам не нравится 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

Не работает. Нет нулевых дат. Кажется, что проблема возникает с 2 или более записями с одним и тем же идентификатором, но с разными датами. Полезно? – Kello

+0

Если для идентификатора существует более трех фактических дат, тогда да, я бы не ожидал увидеть значения NULL. – AHiggins

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