繁体   English   中英

SQL Server 2008 中带有动态列的交叉表查询

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM