La requête dont vous aurez besoin pour obtenir les résultats de votre question est :
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;
Sortie :
StudentID Name Computing Maths English
1 John L2 E3 E2
Bien que vous puissiez vous en sortir, cela nécessite un codage rigoureux des sujets. Si votre liste de sujets est susceptible de changer, alors cette requête ne sera plus adaptée à votre objectif.
Si vous êtes à l'aise, vous pouvez y remédier avec SQL dynamique :
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);
Idéalement, cependant, vous renverriez simplement un ensemble de données, tel qu'il apparaît dans votre table source et laisseriez votre couche de rapport (SSRS par exemple) gérer le pivotement, pour lequel il est bien mieux adapté que le SQL pur.