La query di cui avrai bisogno per ottenere i risultati nella tua domanda è:
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;
Uscita:
StudentID Name Computing Maths English
1 John L2 E3 E2
Anche se, come potresti essere in grado di capire, ciò richiede una codifica rigida dei soggetti. Se è probabile che il tuo elenco di argomenti cambi, questa query non sarà più adatta allo scopo.
Se sei a tuo agio, puoi rimediare con SQL dinamico:
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);
Idealmente, tuttavia, dovresti semplicemente restituire un set di dati, come sembra essere nella tabella di origine e lasciare che il tuo livello di reporting (ad esempio SSRS) gestisca il pivot, a cui è molto più adatto rispetto al puro SQL.