我正在尝试制作一个支持不同数据类型的多列的数据透视表,我感到有些困惑。
我目前有一张桌子,每个高中每年都有一排学生。每行包含有关该年度学生表现的大量信息:GPA,累积学分,英语和数学课程以及这些课程中收到的成绩。其中一些列是数字的,一些是字符串。我想创建一个每个学生一行的表格,其中包含GPA第1年,GPA第2年和GPA第3年,第1年学分,第2年学分和第3年学分,以此类推原始表中的列。
如果这令人困惑,我很抱歉。我很乐意为您提供样本数据来解释我的意思,但我无法弄清楚如何上传文件或格式化表格。
如果我能提供任何其他有用的信息,请告诉我。
答案 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