【问题标题】:SQL Server : Pivot Multiple AggregatesSQL Server:透视多个聚合
【发布时间】:2016-06-10 14:19:02
【问题描述】:

几个小时以来,我一直在寻找有关我的问题的答案。

我的当前表:

StudentName Course  Correct Wrong   Blank   Score
-------------------------------------------------
Student1    Math    38      2       0       95
Student1    English 45      5       0       90
...
Student2    Math    38      2       0       95
Student2    English 45      5       0       90

我想要的是:

             Math                               English
StudentName  Correct    Wrong   Blank   Score   Correct   Wrong Blank   Score
Student1        38      2       0       95      45        5     0       90
Student2        38      2       0       95      45        5     0       90`

...

SELECT     dbo.tbl_Students.StudentName, 
           dbo.tbl_CourseCategories.CourseCategory, 
           dbo.tbl_GeneralTestsScores.Correct, 
           dbo.tbl_GeneralTestsScores.Wrong, 
           dbo.tbl_GeneralTestsScores.NotAnswered, 
           dbo.tbl_GeneralTestsScores.Score
FROM       
           dbo.tbl_AcademicTermsStudents 
INNER JOIN
           dbo.tbl_Students ON dbo.tbl_AcademicTermsStudents.StudentID = dbo.tbl_Students.StudentID 
INNER JOIN
           dbo.tbl_GeneralTestsScores 
INNER JOIN
           dbo.tbl_CourseCategories 

ON         dbo.tbl_GeneralTestsScores.CourseCategoryID = dbo.tbl_CourseCategories.CourseCategoryID 

ON         dbo.tbl_AcademicTermsStudents.StudentID = dbo.tbl_GeneralTestsScores.StudentID
Order By StudentName

我搜索了很多页面,但都没有找到解决方案。

谢谢。

编辑:我也接受以下作为解决方案...

StudentName  Math_C Math_W  Math_B  Math_S   English_C    English_W English_B   English_S
Student1        38      2       0       95      45          5       0       90
Student2        38      2       0       95      45          5       0       90`

【问题讨论】:

  • 您对 c# 中的客户端解决方案感到满意吗? codeproject.com/Articles/796651/…
  • 不要在SQL 中这样做,尝试使用应用层。 SQL 中也不可能有两行 Header
  • 感谢您的 cmets。

标签: sql-server database dynamic pivot multiple-columns


【解决方案1】:

您可以通过“双轴心”实现此目的,方法是在轴心之前为每个主题/分数组合添加一个新的唯一列。

这是一个静态示例,您可以轻松地将其转换为动态支点来满足更多类的需求。您还可以将原始查询放在 CTE 中,根据需要插入临时表或内联 - 为了清楚起见,我使用了单个临时表。

希望这会有所帮助。

--Test Data 
SELECT * INTO #Students FROM (VALUES
('Student1','Math',    38,      2,       0,       95),
('Student1','English', 45,      5,       0,       90),
('Student2','Math',    38,      2,       0,       95),
('Student2','English', 45,      5,       0,       90)
) A (StudentName, CourseName, Correct, Blank, Wrong, Score)

--Pivoting
SELECT StudentName
      ,SUM(Math_Correct) Math_Correct
      ,SUM(Math_Blank) Math_Blank
      ,SUM(Math_Wrong) Math_Wrong
      ,SUM(Math_Score) Math_Score
      ,SUM(English_Correct) English_Correct
      ,SUM(English_Blank) English_Blank
      ,SUM(English_Wrong) English_Wrong
      ,SUM(English_Score) English_Score
 FROM 
    (SELECT 
        S.StudentName
        ,S.CourseName+'_Correct' CourseNameCorrrect
        ,S.CourseName+'_Blank' CourseNameBlank
        ,S.CourseName+'_Wrong' CourseNameWrong
        ,S.CourseName+'_Score' CourseNameScore
        ,S.Correct
        ,S.Blank
        ,S.Wrong
        ,S.Score    
     FROM #Students S ) S2
    PIVOT( MAX(Correct) FOR CourseNameCorrrect IN ([Math_Correct], [English_Correct])) P1
    PIVOT( MAX(Blank) FOR CourseNameBlank IN ([Math_Blank], [English_Blank])) P2
    PIVOT( MAX(Wrong) FOR CourseNameWrong IN ([Math_Wrong], [English_Wrong])) P3
    PIVOT( MAX(Score) FOR CourseNameScore IN ([Math_Score], [English_Score])) P4
    GROUP BY StudentName

StudentName Math_Correct Math_Blank  Math_Wrong  Math_Score  English_Correct English_Blank English_Wrong English_Score
----------- ------------ ----------- ----------- ----------- --------------- ------------- ------------- -------------
Student1    38           2           0           95          45              5             0             90
Student2    38           2           0           95          45              5             0             90

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-14
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多