为什么我的Coalesce()
语句中的Select
语句没有用{0}替换Null
?
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 :(得分: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;
我更喜欢第一种选择。
修改强>
使用COUNT
时显示0为不存在的数据返回的示例:
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;