2016-09-25 24 views
0

列標題在SQL Server 2014顯示行i的數據具有表包含學生不存在信息,使一個CTE從該表顯示StudentNameCNAME作爲列標題和每個缺少小時每門課程的學生。 這是我的CTE代碼:如在CTE

DECLARE @SummaryTable TABLE 
(
    SName nvarchar(50),-- Student Name 
    CName nvarchar(50) -- Course Name 
) 
    INSERT INTO @SummaryTable(SName, CName) 
    SELECT Student_tbl.SName,Sum_Abs from Absence_Summary_tbl 
    inner join Student_tbl on Student_tbl.S_ID = Absence_Summary_tbl.S_ID 
    inner join Stages_tbl on Stages_tbl.Stage_ID = Student_tbl.Stage_ID 
    where Stages_tbl.Stage_ID = 1; 
WITH CTE AS (
SELECT SName, CName, 
     ROW_NUMBER() OVER(PARTITION BY SName ORDER BY CName) AS rn FROM @SummaryTable) 
SELECT SName, 
     MAX(CASE WHEN rn=1 THEN CName ELSE 0 END) AS CName1, 
     MAX(CASE WHEN rn=2 THEN CName ELSE 0 END) AS CName2, 
     MAX(CASE WHEN rn=3 THEN CName ELSE 0 END) AS CName3 
FROM CTE 
GROUP BY SName; 

CTE的結果就像下面的圖片顯示:

http://i68.tinypic.com/1zlsz9v.png[/IMG]

的結果也顯示課程名稱作爲CName1,CName2,CName3作爲列標題

,有沒有什麼方法可以顯示真實的課程名稱,除了別名作爲課程名稱的列標題。在我的真實表'Absence_Summary_tbl'我有一個名爲CName的課程名稱。

+0

你能提供輸出結果和輸入數據嗎?您提到的圖像沒有任何數據。 –

+0

您的示例查詢顯示CName不存儲課程名稱而不是sum_abs。在表格變量中插入[SName,CName,Sum_Abs]。 – p2k

回答

0

在@SummaryTable您要插入的sum_Abs代替CourseName的, @SummaryTable應該有3列SNAME,CNAME,Sum_Abs(存儲每場學生缺席數)

沒有到需要的CTE實現這個 使用Pivot來代替: -

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

select @cols = STUFF((SELECT ',' + QUOTENAME(CName) 
        from Absence_Summary_tbl 
        group by CName 
        order by CName 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT SName,' + @cols + ' from 
      (
       select SName, CName, Sum_Abs 
       from @SummaryTable 
      ) x 
      pivot 
      (
       sum(Sum_Abs) 
       for CName in (' + @cols + ') 
      ) p ' 

execute(@query); 
+0

謝謝你的回答,當我運行你的代碼時,它給了我一個錯誤「必須聲明表變量」SummaryTable「',你的樞軸也需要SummaryTable或者這個錯誤是什麼? –

+0

是你必須聲明表變量如下: - DECLARE @SummaryTable TABLE ( SName nvarchar(50), - 學生姓名 CName nvarchar(50), - 課程名稱 Sum_Abs int - 每個學生缺席的人數每門課程 ) –