2016-11-15 104 views
1

我試圖顯示包含兩個表tblStudentstblExamResults的簡單數據庫的檢查結果。如何在SQL查詢中將列顯示爲行?

tblstudents包括學生證和FULL_NAME列

tblexamResults列student_id數據,主題和標誌。在

下面圖片

tblstudents

1-目前我顯示學生成績使用此查詢

SELECT  tblStudents.Full_Name, tblExamResults.Subject, tblExamResults.Marks 
FROM   tblExamResults INNER JOIN 
         tblStudents ON tblExamResults.Student_id = tblStudents.Student_ID 
order by tblStudents.Full_Name 

2 - 和結果看起來像下面的圖片:

enter image description here

3 - 但我想是爲了顯示每個主題行和讓每個學生的結果顯示在同一行中獲得它下面

每個科目的結果:

Student_Namesub1_resultsub2_Resultsub3_Result

如同下面的圖片(Excel的屏幕截圖)

enter image description here

所以:

  • 我怎麼能顯示該格式數據?
  • SQL Server中可能嗎?
+2

搜索'CROSS TAB','PIVOT'和'DYNAMIC SQL' – Squirrel

+0

使用動態數據透視概念 – Mansoor

回答

2
select fullname,[english] english, [history] history, [physics] physics 
from 
(
    select fullname,subject,marks 
    from (yourquery) 
) src 
pivot 
(
    max(marks) 
    for subject in ([english], [history], [physics]) 
) piv; 

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX); 

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.subject) 
      FROM (yourquery) c 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 


set @query = 'SELECT fullname, ' + @cols + ' from 
      (
       select fullname,subject,marks 
       from (your query) 
      ) x 
      pivot 
      (
       max(marks) 
       for subject in (' + @cols + ') 
      ) p ' 


execute(@query) 
fullname english history physics 
    a 85 70 60 
    i 60 100 89 
    s 90 90 99 
0

最後我用在FROM (yourquery) c

@Chanukya回答與該回答我在5號線得到錯誤becouse括號的變化不大 的下一部分
Declare @query nvarchar(max); 

DECLARE @cols AS NVARCHAR(MAX); 
SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.subject) 
      FROM tblExamResults c ' parentheses Removed from (tblExamResults) c 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,''); 
     print(@cols) 
    set @query = ' 
SELECT * 
FROM (
    SELECT  tblStudents.Full_Name, tblExamResults.Subject, tblExamResults.Marks 
FROM   tblExamResults INNER JOIN 
         tblStudents ON tblExamResults.Student_id = tblStudents.Student_ID 
) as s 
PIVOT 
(
    sum(marks) FOR subject IN ('+ @cols +') 
)AS pvt' 
; 
execute(@query)