在 SQL Server 2008 中使用动态列进行交叉表查询

Crosstab Query with Dynamic Columns in SQL Server 2008

我在 SQL 服务器中遇到交叉表查询问题,希望有人能帮忙吗?

我有以下 table:

- 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

我只需要添加一个分组依据,这样 John 就只出现在一行中,就像我目前看到的那样:

- 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 -

谢谢

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

获得问题结果所需的查询是:

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

尽管您可以解决,但这需要对主题进行硬编码。如果您的主题列表可能会更改,则此查询将不再适用。

如果你很舒服table,你可以用动态 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);

理想情况下,您只需 return 一组数据,因为它看起来在您的源中 table 并让您的报告层(例如 SSRS)处理数据透视,它比纯 SQL.

更适合