質問の結果を取得するために必要なクエリは次のとおりです:
create table StudentResults(StudentID int,Name nvarchar(50),Course nvarchar(50), CourseLevel nvarchar(10));
insert into StudentResults values(1,'John','English','E2'),(1,'John','Maths','E3'),(1,'John','Computing','L2');
select StudentID
,Name
,[Computing]
,[Maths]
,[English]
from StudentResults
pivot(max(CourseLevel) for Course in([Computing],[Maths],[English])
) as p;
出力:
StudentID Name Computing Maths English
1 John L2 E3 E2
解決できるかもしれませんが、これにはサブジェクトをハードコーディングする必要があります。主題のリストが変更される可能性が高い場合、このクエリは目的に適合しなくなります。
慣れている場合は、動的 SQL でこれを修正できます:
declare @cols as nvarchar(max)
,@query as nvarchar(max);
set @cols = stuff(
(select distinct ','+quotename(Course)
from StudentResults
for xml path(''),type).value('.','nvarchar(max)'
)
,1,1,''
);
set @query = 'select StudentID
,Name
,'[email protected]+'
from StudentResults
pivot (max(CourseLevel) for Course in ('[email protected]+')
) p';
execute (@query);
ただし、理想的には、ソース テーブルにあるように見える一連のデータを単純に返し、レポート レイヤー (SSRS など) にピボットを処理させます。これは、純粋な SQL よりもはるかに適しています。