Die Abfrage, die Sie benötigen, um die Ergebnisse Ihrer Frage zu erhalten, lautet:
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;
Ausgabe:
StudentID Name Computing Maths English
1 John L2 E3 E2
Wie Sie vielleicht herausfinden können, erfordert dies jedoch eine harte Codierung der Themen. Wenn sich Ihre Themenliste voraussichtlich ändern wird, ist diese Abfrage nicht mehr zweckdienlich.
Wenn Sie sich wohlfühlen, können Sie dies mit dynamischem SQL beheben:
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);
Im Idealfall würden Sie jedoch einfach einen Satz von Daten zurückgeben, wie er in Ihrer Quelltabelle zu sein scheint, und Ihre Berichtsschicht (z. B. SSRS) das Pivotieren durchführen lassen, wofür sie viel besser geeignet ist als reines SQL.