这是我的解决方案。
首先,如果你不需要动态的,你可以使用这个:
-- Create demo data
CREATE TABLE #data (id int, year int, amount int)
INSERT INTO #data(id, year, amount)
VALUES (1,1991,25),
(1,1992,24),
(2,1991,25),
(2,1992,24)
-- Your work:
SELECT pvt.*
FROM (
SELECT id, CONVERT(nvarchar(max),year)+N'_amount' as year,
CONVERT(nvarchar(max),year)+N'_'+CONVERT(nvarchar(max),amount) as amount
FROM #data
) as dat
PIVOT (
MAX(amount)
FOR year IN([1991_amount],[1992_amount])
) as pvt
-- Cleanup
DROP TABLE #data
GO
如果你真的需要一个动态的,你可以改用这个:
-- Create demo data
CREATE TABLE #data (id int, year int, amount int)
INSERT INTO #data(id, year, amount)
VALUES (1,1991,25),
(1,1992,24),
(2,1991,25),
(2,1992,24)
-- Your work:
DECLARE @sql nvarchar(max), @columns nvarchar(max)
SELECT @columns = COALESCE(
@columns + N',['+ CONVERT(nvarchar(max),year) + N'_amount]', N'['+
CONVERT(nvarchar(max),year) + N'_amount]'
)
FROM (
-- Distinct do avoid duplicated year columns
SELECT DISTINCT year
FROM #data
) as dat
SET @sql = N'
SELECT pvt.*
FROM (
SELECT id, CONVERT(nvarchar(max),year)+N''_amount'' as year,
CONVERT(nvarchar(max),year)+N''_''+ CONVERT(nvarchar(max),amount) as amount
FROM #data
) as dat
PIVOT (
MAX(amount)
FOR year IN('+@columns+')
) as pvt'
EXEC(@sql)
-- Cleanup
DROP TABLE #data
只是一个小小的补充。如果您可能对包含id 和year 的组有多个金额,则可以将子查询或dat 替换为该子查询以使用SUM 并将它们相加。
在这种情况下,你替换这个:
FROM (
SELECT id, CONVERT(nvarchar(max),year)+N'_amount' as year,
CONVERT(nvarchar(max),year)+N'_'+CONVERT(nvarchar(max),amount) as amount
FROM #data
) as dat
用这个:
FROM (
SELECT id, CONVERT(nvarchar(max),year)+N'_amount' as year,
CONVERT(nvarchar(max),year)+N'_'+CONVERT(nvarchar(max),SUM(amount)) as amount
FROM #data
GROUP BY id, year
) as dat
它将提供以下结果集:
id 1991_amount 1992_amount
----------- ------------ ------------
1 1991_25 1992_24
2 1991_25 1992_24