Pivot/Transpose 行转换为列并将 NULL 转换为 0

Pivot/Transpose rows into column and convert NULLs into 0's

我有一些数据如下所示:

    Table1
    Number        TYPE         Acct         Total
    ------        ---          ---          ----
    1X2           GGG          111          100
    1X2           GGG          222          200

我想做的是 PIVOT 这个数据,这样它看起来像这样:

   Number         Type         111          222
   -----          ---          ---          ---
   1X2            GGG          100          200

我是这样调整的:

   Select * from Table1
                 PIVOT (MAX(Total)
                    FOR ACCT in ([111],[222],[333])

现在这对 Acct 111 和 222 非常有效,但对于 333,Total = NULL。事情在这里,我有时可能拥有所有三个 ACCT,如 111、222 和 333。其他时候,如上例所示,其中一个可能丢失。

任何人,当我进行数据透视时,数据如下所示:

       Number         Type         111          222        333
       -----          ---          ---          ---        ---
       1X2            GGG          100          200        NULL <-- I'm trying to set this to 0

如您所见,333 的值为 NULL - IS there anyway I can set this value to 0?

两种选择。第一个将使用 coalesce() 来消除空值。第二个将通过 CROSS JOINUNION ALL(蛮力)

创建一组独特的交叉点

例子

Declare @YourTable Table ([Number] varchar(50),[TYPE] varchar(50),[Acct] varchar(50),[Total] varchar(50))
Insert Into @YourTable Values 
 ('1X2','GGG',111,100)
,('1X2','GGG',222,200)

Select Number
      ,Type
      ,[111]  = coalesce( [111] ,0)
      ,[222]  = coalesce( [222] ,0)
      ,[333]  = coalesce( [333] ,0)
 From @YourTable
 PIVOT (MAX(Total)
 FOR ACCT in ([111],[222],[333])) pvt

第二个选项:

您可能注意到我在最后一个 CROSS JOIN 中提供了 Accts,因为 333 不在示例数据的范围内。如果它存在,您可以像我们在交叉应用 1 和 2 中使用的那样使用 Select Distinct Acct

Select *
 From ( Select * from @YourTable
        Union All
        Select Number,Type,Acct,0
         From  ( Select distinct Number  from @YourTable ) A
         Cross Join (Select distinct Type from @YourTable) B
         Cross Join (
                        Select * from  (values ('111' )
                                              ,('222' )
                                              ,('333' )
                                       )v(Acct)
                    ) C
      ) src
 PIVOT (MAX(Total)
 FOR ACCT in ([111],[222],[333])) pvt

两个结果都是