I need to dynamically transform data in table #table from this format:
spot_id name pct ------- ---- --- 1 A 2 1 B 8 1 C 6 2 A 4 2 B 5 3 A 5 3 D 1 3 E 4
to:
spot_id A B C D E ------- --- --- --- --- --- 1 2 5 6 0 0 2 4 5 0 0 0 3 5 0 0 1 4
The thing is that I don't know in advance what the values of column "name" are or how many of them there are, so I think that I have to use some kind of dynamic SQL pivoting
Just figured out how to solve the problem:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT ',' + QUOTENAME(name)
from (SELECT DISTINCT name FROM #table) T
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = N'SELECT spot_id,' + @cols + N' from
(
select spot_id, name, pct
from #table
) as x
pivot
(
max(pct)
for name in (' + @cols + N')
) as p '
exec sp_executesql @query;
If there more elegant way to do the same?
Using Dynamic Query :