具有多个列和数据类型的t-sql数据透视表

时间:2015-07-17 17:41:12

标签: sql-server sql-server-2008 tsql pivot

我正在尝试制作一个支持不同数据类型的多列的数据透视表,我感到有些困惑。

我目前有一张桌子,每个高中每年都有一排学生。每行包含有关该年度学生表现的大量信息:GPA,累积学分,英语和数学课程以及这些课程中收到的成绩。其中一些列是数字的,一些是字符串。我想创建一个每个学生一行的表格,其中包含GPA第1年,GPA第2年和GPA第3年,第1年学分,第2年学分和第3年学分,以此类推原始表中的列。

如果这令人困惑,我很抱歉。我很乐意为您提供样本数据来解释我的意思,但我无法弄清楚如何上传文件或格式化表格。

如果我能提供任何其他有用的信息,请告诉我。

1 个答案:

答案 0 :(得分:1)

你可以转动多个列,但很快就会变得非常丑陋。您必须为枢轴列设置与将执行的枢轴一样的别名,因为该列无法重新用于后续枢轴。一个好的命名约定有帮助。最后,你必须通过将整个事物包装在一个组中来聚合结果。

with somedata ([StudentID], [Year], [GPA], [Credits], [NumMathCourses])
AS (
    SELECT 100, 2013, 3.6, 15, 3 UNION ALL
    SELECT 100, 2014, 3.7, 12, 1 UNION ALL
    SELECT 100, 2015, 3.9, 18, 0 UNION ALL
    SELECT 999, 2012, 2.5, 9, 1 UNION ALL
    SELECT 999, 2013, 2.9, 12, 0 UNION ALL
    SELECT 999, 2014, 1.8, 18, 0
)

SELECT StudentID
    ,MAX([2012gpa]) AS [GPA 2012]
    ,MAX([2013gpa]) AS [GPA 2013]
    ,MAX([2014gpa]) AS [GPA 2014]
    ,MAX([2015gpa]) AS [GPA 2015]
    ,MAX([2012cre]) AS [Credits 2012]
    ,MAX([2013cre]) AS [Credits 2013]
    ,MAX([2014cre]) AS [Credits 2014]
    ,MAX([2015cre]) AS [Credits 2015]
    ,MAX([2012nmc]) AS [Num Math Courses 2012]
    ,MAX([2013nmc]) AS [Num Math Courses 2013]
    ,MAX([2014nmc]) AS [Num Math Courses 2014]
    ,MAX([2015nmc]) AS [Num Math Courses 2015]

FROM (
    SELECT StudentID
        ,CONCAT([Year], 'gpa') AS Year_GPA
        ,CONCAT([Year], 'cre') AS Year_Credits
        ,CONCAT([Year], 'nmc') AS Year_NumMathCourses
        ,GPA
        ,Credits
        ,NumMathCourses
    FROM somedata
) [data]

PIVOT (
    MAX(GPA) FOR Year_GPA IN (
        [2012gpa], [2013gpa], [2014gpa], [2015gpa]
    )
) [pivot_gpa]

PIVOT (
    MAX(Credits) FOR Year_Credits IN (
        [2012cre], [2013cre], [2014cre], [2015cre]
    )
) [pivot_Credits]

PIVOT (
    MAX(NumMathCourses) FOR Year_NumMathCourses IN (
        [2012nmc], [2013nmc], [2014nmc], [2015nmc]
    )
) [pivot_NumMathCourses]

GROUP BY StudentID
相关问题