在CTE中将行数据显示为列标题

时间:2016-09-25 08:55:46

标签: sql-server

在SQL Server 2014中我有一个包含学生缺席信息的表格,我从该表格中选择CTE以显示 StudentName CName 作为列标题和缺勤时间每个课程的每个学生。 这是我的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 的专栏中有一个课程名称。

1 个答案:

答案 0 :(得分:0)

在@SummaryTable中,您插入sum_Abs而不是CourseName, @SummaryTable应该有3列SName,CName,Sum_Abs(用于存储每个学生每门课程缺席的数量)

没有必要通过CTE实现这一目标 改为使用Pivot: -

$_SERVER['REQUEST_URI']