2016-09-25 5 views
0

в SQL Server 2014 У меня есть таблицы, которые содержат информацию, отсутствие студента, я сделать КТР из этой таблицы, чтобы отобразить StudentName, CNAME как заголовок колонки и отсутствие часов для каждого студент в каждом курсе. это мой КТР код:отображения строк данных в виде заголовка столбца в КТР

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; 

Результат КТР является дисплей, как изображение ниже:

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

в результате его отображения названия курса как CName1, CName2, CName3 как заголовки столбцов, есть ли способ отображать имена реальных курсов, кроме псевдонимов, в виде заголовков столбцов для названий курсов. в моей реальной таблице 'Absence_Summary_tbl' У меня есть название курса в столбце CName.

+0

Можете ли вы предоставить выходные результаты и входные данные? У изображения, о котором вы упомянули, нет никаких данных. –

+0

Ваш образец запроса показывает, что CName не сохраняет имя курса, а скорее sum_abs. Вставьте переменную table в поле [SName, CName, Sum_Abs]. – p2k

ответ

0

В @SummaryTable вы вставив sum_Abs вместо CourseName, @SummaryTable должен иметь 3 колонки SNAME, CNAME, Sum_Abs (для хранения отсутствующего счета на одного студента на курс)

нет необходимости КТР в достигните этого Вместо этого используйте 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), - Student Имя CNAME NVARCHAR (50), - Название курса Sum_Abs Int - отсутствующее количество на одного студента за курс ) –