2015-07-04 3 views

ответ

2

Вот мое решение.

Во-первых, если вам не нужен динамический, который вы можете использовать это:

-- 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 
+0

когда я бегу ошибка в + N» _ '+ CONVERT –

+0

получил неправильный синтаксис –

+0

Мне нужно, он также обрабатывает заголовок столбца –

Смежные вопросы