使用Pivot显示0不为空

时间:2015-03-23 13:15:26

标签: sql-server-2008 coalesce

为什么我的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

1 个答案:

答案 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;