Du kan använda PIVOT-funktionen för att få resultatet, du behöver bara använda row_number()
att hjälpa.
Grundfrågan för detta kommer att vara:
select skill_id, skill, parameter,
row_number() over(partition by skill, skill_id order by skill_id) rn
from yt;
Se SQL-fiol med demo
. Jag använder row_number()
för att tillämpa ett distinkt värde på varje rad inom skill
och skill_id
, kommer du sedan att använda detta radnummervärde som kolumn för att PIVOT.
Den fullständiga koden med PIVOT tillämpad kommer att vara:
select skill_id, skill,[Parameter_1], [Parameter_2], [Parameter_3]
from
(
select skill_id, skill, parameter,
'Parameter_'+cast(row_number() over(partition by skill, skill_id
order by skill_id) as varchar(10)) rn
from yt
) d
pivot
(
max(parameter)
for rn in ([Parameter_1], [Parameter_2], [Parameter_3])
) piv;
Se SQL-fiol med demo .
I ditt fall verkar det som att du kommer att ha ett okänt antal parametrar för varje färdighet. Om det är sant, kommer du att vilja använda dynamisk SQL för att få resultatet:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME('Parameter_'
+cast(row_number() over(partition by skill, skill_id
order by skill_id) as varchar(10)))
from yt
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT skill_id, skill,' + @cols + ' from
(
select skill_id, skill, parameter,
''Parameter_''+cast(row_number() over(partition by skill, skill_id
order by skill_id) as varchar(10)) rn
from yt
) x
pivot
(
max(parameter)
for rn in (' + @cols + ')
) p '
execute(@query);