Dotaz, který budete potřebovat k získání výsledků ve své otázce, je:
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;
Výstup:
StudentID Name Computing Maths English
1 John L2 E3 E2
I když, jak můžete zjistit, to vyžaduje tvrdé kódování předmětů. Pokud se váš seznam předmětů pravděpodobně změní, pak tento dotaz již nebude vyhovovat účelu.
Pokud vám to vyhovuje, můžete to napravit pomocí dynamického 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);
V ideálním případě byste však jednoduše vrátili sadu dat, jak se zdá ve vaší zdrojové tabulce, a nechali vaši vrstvu sestav (například SSRS) zvládnout pivotování, ke kterému se hodí mnohem lépe než čistý SQL.