我想将此表格转到下表(预期结果)
CompanyID Amount Status ID Year
58 10000.00 PENDING 54 2018
59 10000.00 PENDING 55 2018
59 5300.00 PAID 56 2015
59 5300.00 PENDING 57 2013
59 10600.00 PENDING 58 2016
60 10600.00 PAID 59 2016
60 10600.00 PENDING 60 2017
60 10000.00 PENDING 61 2018
61 10000.00 PAID 62 2018
61 10600.00 PAID 63 2016
61 10600.00 PAID 64 2017
67 5300.00 PAID 65 2015
67 10600.00 PAID 66 2016
我正在尝试使用枢轴/枢轴,但仍然无法正常工作
CompanyID A2015 S2015 A2016 S2016 A2017 S2017 A2018 S2018
58 NULL NULL NULL NULL NULL NULL 10000.00PENDING
59 NULL NULL NULL NULL NULL NULL NULL NULL
59 NULL NULL NULL NULL NULL NULL 10000.00PENDING
59 NULL NULL 10600.00PENDING NULL NULL NULL NULL
59 5300.00PAID NULL NULL NULL NULL NULL NULL
60 NULL NULL NULL NULL NULL NULL 10000.00PENDING
60 NULL NULL NULL NULL 10600.00PENDING NULL NULL
60 NULL NULL 10600.00PAID NULL NULL NULL NULL
61 NULL NULL NULL NULL NULL NULL 10000.00PAID
61 NULL NULL NULL NULL 10600.00PAID NULL NULL
61 NULL NULL 10600.00PAID NULL NULL NULL NULL
67 NULL NULL NULL NULL NULL NULL 10000.00PAID
67 NULL NULL NULL NULL 10600.00PAID NULL NULL
试图在一个查询中转换2种不同的数据类型和多列
SELECT CompanyID,[A2015],[S2015],[A2016],[S2016],[A2017],[S2017],[A2018],[S2018]
FROM
( SELECT CompanyID, [Status],
'A' + [Year] AS [Year_Amount],
'S' + [Year] AS [Year_Status],
(Select ORGANIZATION from [Membership].[dbo].[Members]
where ID=[Payment].CompanyID ) as Organisation,[Amount]
FROM [Membership].[dbo].[Payment]) as sourcetable
pivot (
SUM([Amount]) for [Year_Amount] in ([A2015],[A2016],[A2017],[A2018]))
as Pvt
pivot (
MIN([Status]) for [Year_Status] in ([S2015],[S2016],[S2017],[S2018]))
as Pvt2
预期的输出应该是这样
CompanyID A2015 S2015 A2016 S2016 A2017 S2017 A2018 S2018
58 NULL NULL NULL NULL NULL NULL 10000.00 PENDING
59 5300.00 PAID 10600.00 PENDING NULL NULL 10000.00 PENDING
60 NULL NULL 10600.00 PAID 10600.00 PENDING 10000.00 PENDING
61 NULL NULL 10600.00 PAID 10600.00 PAID 10000.00 PAID
67 NULL NULL NULL NULL 10600.00 PAID 10000.00 PAID
伙计,请先谢谢
答案 0 :(得分:0)
这里的问题似乎是对金额进行pivot
时pivoting
中存在多余的列。我认为您需要做两个单独的pivoting
,然后合并它们的结果。为了在我的本地机器上对此进行测试,我创建了一个变量表,即@xyz
,如下面的脚本所示-
declare @xyz table (CompanyID int, Amount decimal(10,2), [Status] varchar(50), ID int, [Year] varchar(4));
insert into @xyz
select 58, 10000.00, 'PENDING' ,54, '2018'
union all select 59, 10000.00, 'PENDING' ,55, '2018'
union all select 59, 5300.00 , 'PAID' ,56, '2015'
union all select 59, 5300.00 , 'PENDING' ,57, '2013'
union all select 59, 10600.00, 'PENDING' ,58, '2016'
union all select 60, 10600.00, 'PAID' ,59, '2016'
union all select 60, 10600.00, 'PENDING' ,60, '2017'
union all select 60, 10000.00, 'PENDING' ,61, '2018'
union all select 61, 10000.00, 'PAID' ,62, '2018'
union all select 61, 10600.00, 'PAID' ,63, '2016'
union all select 61, 10600.00, 'PAID' ,64, '2017'
union all select 67, 5300.00 , 'PAID' ,65, '2015'
union all select 67, 10600.00, 'PAID' ,66, '2016'
;WITH Amount_Pivoting AS (
SELECT * FROM (
SELECT
CompanyID,
'A' + [Year] AS [Year_Amount],
[Amount]
FROM @xyz
) AS sourcetable
PIVOT (
SUM([Amount]) for [Year_Amount] in ([A2015],[A2016],[A2017],[A2018]))
AS Pvt
),
Status_Pivoting AS (
SELECT * FROM (
SELECT
CompanyID,
'S' + [Year] AS [Year_Status],
[Status]
FROM @xyz
) AS sourcetable
PIVOT (
MIN([Status]) for [Year_Status] in ([S2015],[S2016],[S2017],[S2018]))
AS Pvt
)
SELECT *
FROM Amount_Pivoting A
INNER JOIN Status_Pivoting S ON A.CompanyID = S.CompanyID;
注意-我在此脚本中使用了CTE
来保存两个数据透视结果。请用表名替换@xyz
。