Bạn có thể sử dụng hàm PIVOT để nhận kết quả, bạn chỉ cần sử dụng row_number()
giúp đỡ.
Truy vấn cơ bản cho điều này sẽ là:
select skill_id, skill, parameter,
row_number() over(partition by skill, skill_id order by skill_id) rn
from yt;
Xem SQL Fiddle with Demo
. Tôi sử dụng row_number()
để áp dụng một giá trị riêng biệt cho từng hàng trong skill
và skill_id
, sau đó bạn sẽ sử dụng giá trị số hàng này làm cột để PIVOT.
Mã đầy đủ với PIVOT được áp dụng sẽ là:
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;
Xem SQL Fiddle with Demo .
Trong trường hợp của bạn, có vẻ như bạn sẽ có một số lượng thông số chưa biết cho mỗi kỹ năng. Nếu điều đó là đúng, thì bạn sẽ muốn sử dụng SQL động để nhận được kết quả:
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);