将行旋转/转置为列并将 NULL 转换为 0

时间:2021-06-15 16:13:53

标签: sql-server tsql pivot ssms transpose

我有一些看起来像这样的数据:

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

我想要做的是将这些数据转为透视,使其看起来像这样:

   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?

1 个答案:

答案 0 :(得分:1)

两个选项。第一个将使用 SELECT salary FROM Employee WHERE salary < (SELECT MAX(e2.salary) FROM Employee e2) 来消除空值。第二个将通过 coalesce()CROSS JOIN(蛮力)

创建一组独特的交叉点

示例

UNION 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 中提供了 Accts,因为 CROSS JOIN 不在示例数据的范围内。如果它存在,您可以使用我们在 Cross Apply 1 和 2 中使用的 333

Select Distinct Acct

两个结果都是

enter image description here

相关问题