Потому что вы используете его во внутреннем запросе, в то время как проблема заключается в том, что запись не существует она так 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;
Поскольку вы используете 'COALESCE' в неправильном месте. Он должен находиться во внешнем 'SELECT' – Lamak
count() не может вернуть значение null. Он либо возвращает ноль, либо ненулевое значение. –