Заявката, от която ще се нуждаете, за да получите резултатите във вашия въпрос, е:
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;
Изход:
StudentID Name Computing Maths English
1 John L2 E3 E2
Въпреки че, както може да сте в състояние да разберете, това изисква твърдо кодиране на темите. Ако списъкът ви с теми има вероятност да се промени, тогава тази заявка вече няма да отговаря на целта.
Ако ви е удобно, можете да поправите това с динамичен 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);
В идеалния случай обаче бихте могли просто да върнете набор от данни, както изглежда във вашата изходна таблица, и да оставите вашия отчетен слой (SSRS например) да се справи с обръщането, за което е много по-подходящ от чистия SQL.