Frågan du behöver för att få resultaten i din fråga är:
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;
Utdata:
StudentID Name Computing Maths English
1 John L2 E3 E2
Även om du kanske kan träna kräver detta hård kodning av ämnena. Om din lista över ämnen sannolikt kommer att ändras, kommer den här frågan inte längre att passa för ändamålet.
Om du är bekväm kan du åtgärda detta med dynamisk 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);
Helst skulle du dock helt enkelt returnera en uppsättning data, som den verkar finnas i din källtabell och låta ditt rapportlager (till exempel SSRS) hantera pivoteringen, vilket det är mycket bättre lämpat för än ren SQL.