Можете да използвате функцията PIVOT, за да получите резултата, просто ще трябва да използвате row_number()
да помогна.
Основната заявка за това ще бъде:
select skill_id, skill, parameter,
row_number() over(partition by skill, skill_id order by skill_id) rn
from yt;
Вижте SQL Fiddle с демонстрация
. Използвам row_number()
за да приложите отделна стойност към всеки ред в skill
и skill_id
, след това ще използвате тази стойност на номера на реда като колона за PIVOT.
Пълният код с приложената PIVOT ще бъде:
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;
Вижте SQL Fiddle с демонстрация .
Във вашия случай изглежда, че ще имате неизвестен брой параметри за всяко умение. Ако това е вярно, тогава ще искате да използвате динамичен SQL, за да получите резултата:
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);
Вижте SQL Fiddle с демонстрация