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 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
第二个选项:
您可能注意到我在最后一个 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
两个结果都是
我有一些数据如下所示:
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 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
第二个选项:
您可能注意到我在最后一个 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
两个结果都是