2015-03-23 3 views
0

Почему мой оператор Coalesce() в моем первоначальном заявлении Select не заменил Null на 0?Show 0 Not Null With Pivot

Select * From 
(
    Select a.orderstatus As [Stat], Coalesce(Count(b.id), '0') As [Count], b.region 
    From orderstatus a 
    Left Join saleinfo b 
    on b.orderstatus = a.orderstatus 
    Group By a.orderstatus, b.region 
) one 
    pivot (Max([Count]) For region In ([East], [West], [North], [South])) pv 
+0

Поскольку вы используете 'COALESCE' в неправильном месте. Он должен находиться во внешнем 'SELECT' – Lamak

+0

count() не может вернуть значение null. Он либо возвращает ноль, либо ненулевое значение. –

ответ

2

Потому что вы используете его во внутреннем запросе, в то время как проблема заключается в том, что запись не существует она так PIVOT является создание NULL после того, как внутренний запрос был обработан. Если ваш запрос (one) вернулся:

Stat Count Region 
------------------------- 
Stat1 0  East 
Stat2 2  East 
Stat1 5  West 

Вы будете в конечном итоге с сводной таблицы, как

Stat East West North South 
--------------------------------------- 
Stat1 0  5  NULL NULL 
Stat2 2  NULL NULL NULL 

К примеру, вы получаете NULL для (Stat2, West), потому что нет никакого результата в вашем подзапрос, поэтому COALESCE не помогает. Ваша работа вокруг было бы просто использовать COUNT в самом PIVOT:

SELECT pvt.OrderStatus, pvt.East, pvt.West, pvt.North, pvt.South 
FROM ( SELECT os.OrderStatus, si.Region, si.ID 
      FROM OrderStatus AS os 
        LEFT JOIN SaleInfo AS si 
         ON si.OrderStatus = b.OrderStatus 
     ) AS t 
     PIVOT 
     ( COUNT(ID) 
      FOR Region IN ([East], [West], [North], [South]) 
     ) AS pvt; 

Или поставить COALESCE во внешнем выберите:

SELECT pvt.OrderStatus, 
     East = COALESCE(pvt.East, 0), 
     West = COALESCE(pvt.West, 0), 
     North = COALESCE(pvt.North, 0), 
     South = COALESCE(pvt.South, 0) 
FROM ( SELECT os.OrderStatus, si.Region, [Count] = COUNT(si.ID) 
      FROM OrderStatus AS os 
        LEFT JOIN SaleInfo AS si 
         ON si.OrderStatus = b.OrderStatus 
     ) AS t 
     PIVOT 
     ( MAX([Count]) 
      FOR Region IN ([East], [West], [North], [South]) 
     ) AS pvt; 

Я предпочитаю первый вариант, хотя.


EDIT

Пример показывает 0 возвращена для несуществующих данных при использовании COUNT:

SELECT pvt.Stat, pvt.East, pvt.West, pvt.North, pvt.South 
FROM (VALUES 
      ('Stat1', 'East', 1), 
      ('Stat2', 'East', 2), 
      ('Stat1', 'West', 3) 
     ) t (Stat, Region, ID) 
     PIVOT 
     ( COUNT(ID) 
      FOR Region IN ([East], [West], [North], [South]) 
     ) AS pvt; 
+0

Там все равно может быть 'NULL'. Решение заключается в использовании 'ISNULL' или' COALESCE' в вашем 'SELECT':' SELECT pvt.OrderStatus, ISNULL (pvt.East, 0) East .... ' – Lamak

+0

@Lamak, в каком сценарии' COUNT' return ' NULL'? – GarethD

+0

Не является ли 'COUNT', который возвращает null, так это то, что может быть строка для определенного стата, которая просто не имеет значения для Востока, Запада, Севера или Юга – Lamak