Вот мое решение.
Во-первых, если вам не нужен динамический, который вы можете использовать это:
-- 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('[email protected]+')
) 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
когда я бегу ошибка в + N» _ '+ CONVERT –
получил неправильный синтаксис –
Мне нужно, он также обрабатывает заголовок столбца –