2016-02-27 94 views
1

我一直在尋找關於我的問題幾個小時的答案。SQL Server:樞軸多個聚合體

我現在的表:

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` 
+0

你會對c#中的客戶端解決方案感到滿意嗎? http://www.codeproject.com/Articles/796651/Client-Side-Multi-Column-Dynamic-Pivot –

+0

不要在'SQL'中嘗試使用應用程序層。另外兩行Header在'SQL'中是不可能的 –

+0

感謝您的評論。 – Meliksah

回答

0

您可以通過轉動前加入每科/得分組合一個新的獨特的柱,以「雙支點」實現這一目標。

下面是一個靜態示例,您可以輕鬆將其轉換爲動態數據透視表以滿足更多課程的需求。您也可以將您的原始查詢放入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