[英]Crosstab Query with Dynamic Columns in SQL Server 2008
我在 SQL Server 中遇到了交叉表查询的问题,希望有人能帮忙吗?
我有下表:
- Student ID - Name - Course - Course Level -
- 1 - John - English - E2 -
- 1 - John - Mathns - E3 -
- 1 - John - Computing - L2 -
每个学习者都必须参加英语、数学和计算机评估,并给出一个级别。
我需要在一行中报告一名学习者在每次评估中取得的成绩,如下所示:
- StudentID - Name - English - Maths - Computing -
- 1 - John - E2 - E3 - L2 -
我从下面的评论中得到了这个代码:谢谢@iamdave。
SELECT PERSON_CODE, [Computing], [Maths], [English]
FROM TT
PIVOT (MAX(LEVEL) FOR COURSE_CODE IN ([DL], [NUM15], [ENG15])) AS P
我只需要添加一个组,以便约翰只显示为一行,因为我目前看到的是:
- StudentID - Name - English - Maths - Computing -
- 1 - John - E2 - E3 - L2 -
- 1 - John - E2 - E3 - L2 -
- 1 - John - E2 - E3 - L2 -
代替:
- StudentID - Name - English - Maths - Computing -
- 1 - John - E2 - E3 - L2 -
- 2 - Amy - L1 - L2 - E3 -
谢谢
获得问题结果所需的查询是:
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
,'+@cols+'
from StudentResults
pivot (max(CourseLevel) for Course in ('+@cols+')
) p';
execute (@query);
理想情况下,您只需返回一组数据,因为它似乎在您的源表中,并让您的报告层(例如 SSRS)处理数据透视,这比纯 SQL 更适合。
SELECT studentId,
StudentName,
English,
Maths,
Computing
FROM (
SELECT T.StudentId,
T.StudentName,
T.Course,
T.CourseLevel
FROM Test T
) AS J
PIVOT(MAX(CourseLevel) FOR Course IN (
[English],
[Maths],
[Computing]
)) AS P
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.