Zapytanie potrzebne do uzyskania wyników w pytaniu to:
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;
Wyjście:
StudentID Name Computing Maths English
1 John L2 E3 E2
Chociaż możesz być w stanie poćwiczyć, wymaga to trudnego kodowania tematów. Jeśli Twoja lista tematów prawdopodobnie ulegnie zmianie, to zapytanie nie będzie już pasować do celu.
Jeśli czujesz się komfortowo, możesz temu zaradzić za pomocą dynamicznego 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);
Idealnie byłoby jednak, gdybyś po prostu zwrócił zestaw danych, tak jak wydaje się, że znajduje się w tabeli źródłowej, a warstwa raportowania (na przykład SSRS) zajmie się przestawianiem, do którego jest znacznie lepiej przystosowana niż czysty SQL.