データを列に変換する方法はいくつかあります。
CASE
式で集計関数を使用できます。
select name,
max(case when rn = 1 then department end) Department1,
max(case when rn = 2 then department end) Department2,
max(case when rn = 3 then department end) Department3
from
(
select name,
department,
row_number() over(partition by name order by department) rn
from yt
) src
group by name;
デモで SQL Fiddle を参照してください
PIVOT を使用して、データを行から列に変換できます。
select *
from
(
select name,
department,
'Department'
+cast(row_number() over(partition by name order by department) as varchar(10)) col
from yt
) src
pivot
(
max(department)
for col in ([Department1], [Department2], [Department3])
) piv;
デモで SQL Fiddle を参照してください
名前ごとの部門の数が不明な場合があるため、動的 SQL を使用して結果を取得することをお勧めします。動的 SQL コードは次のようになります。
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(col)
from
(
select 'department'+
cast(row_number() over(partition by name order by department) as varchar(10)) col
from yt
) src
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT name, ' + @cols + '
from
(
select name, department,
''department''+
cast(row_number() over(partition by name order by department) as varchar(10)) col
from yt
) x
pivot
(
max(department)
for col in (' + @cols + ')
) p '
execute(@query);
デモで SQL Fiddle を参照してください