Вы можете найти аналогичный запрос, который будет выполняться и в более низкой версии SQL Server.
-- query
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX);
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(Channel + Convert(Varchar(4) ,Year))
FROM testTable c
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT Id, ' + @cols + ' from
(
select Id, Payments,
Channel + Convert(Varchar(4) ,Year) NewCol
from testTable
) x
pivot
(
max(Payments)
for NewCol in (' + @cols + ')
) p '
execute(@query)
Здесь вы можете найти живую демонстрацию .
РЕДАКТИРОВАТЬ
Чтобы сохранить данные во временной таблице, вы можете попробовать следующий запрос.
create table MyTable
(
Id int,
Year int,
Channel varchar(10),
Payments int
)
insert into MyTable values
(1,2012,'HV',100),
(1,2014,'HV',56),
(2,2012,'NL',17000),
(2,2012,'HV',495),
(3,2013,'HV',565)
Declare @SQL varchar(max) = '
if object_id(''##TestTable'') is not null
begin
drop table ##TestTable
end
create table ##TestTable([Id] int null, ' +
Stuff((Select Distinct ','+QuoteName(Channel + CONVERT(Varchar(4), Year)) + ' Varchar(20) null'
From [dbo].MyTable
Order By 1
For XML Path('')),1,1,'')+ ')
INSERT INTO ##TestTable
Select *
From (
Select A.ID, A.Payments
,B.*
From [dbo].MyTable a
Cross Apply ( values ( Channel + CONVERT(Varchar(4), Year)
)) B ([Value])
) S
Pivot (sum([Payments]) For [Value] in
(' + Stuff((Select Distinct ','+QuoteName(Channel + CONVERT(Varchar(4), Year))
From myTable
Order By 1
For XML Path('')),1,1,'') + ') ) p'
--SELECT @SQL
Exec(@SQL)
SELECT * FROM ##TestTable
Вы можете найти демонстрационную версию здесь .