Сложный Пивот - PullRequest
       16

Сложный Пивот

5 голосов
/ 01 июня 2011

Я сократил сложную схему до следующих образцов

Студенты

  • StudentID int, Имя varchar (50)
  • 1, Билл
  • 2, Эми
  • 3, Бет
  • 4, Скотт
  • 5, Стив

Классы

  • ClassID int, Имя varchar (50), Period varchar (50)
  • 1, Algebra, Period1
  • 2, География, Period3
  • 3, Биология, Период 5
  • 4, Физика, Период 4
  • 5, Речь, Период 2
  • 6, История, Период 6

и соединительная таблица

StudentsClasses

  • StudentID int, ClassID int
  • 1, 1
  • 1,4
  • 1, 5
  • 2, 6
  • 3, 5
  • 3, 4
  • 3, 6
  • 4, 1
  • 4, 4
  • 5, 5
  • 5, 6

Моя цель - перечислить каждого студента с ихвыбранные классы перечислены в порядке периодов.У меня есть следующий вариант выбора

SELECT Name,Period1, Period2, Period3, 
    Period4, Period5, Period6  
    FROM (
SELECT _Students.Name AS [NAME],_Classes.Period AS PIVOT_CODE, _Classes.name as [Class] 
FROM _Classes 
    INNER JOIN _StudentsClasses ON _Classes.ClassID=_StudentsClasses.ClassID 
    INNER JOIN _Students ON _StudentsClasses.StudentID=_Students.StudentID
)
    AS data
    PIVOT 
    (  min([Class])  FOR [PIVOT_CODE] IN 
        (Period1, Period2, Period3, 
    Period4, Period5, Period6)
    ) AS pvt

, что приводит к

Name   Period1   Period2   Period3   Period4   Period5   Period6
------ --------- --------- --------- --------- --------- ----------
Amy    NULL      NULL      NULL      NULL      NULL      History
Beth   NULL      Speech    NULL      Physics   NULL      History
Bill   Algebra   Speech    NULL      Physics   NULL      NULL
Scott  Algebra   NULL      NULL      Physics   NULL      NULL
Steve  NULL      Speech    NULL      NULL      NULL      History

. Там, где мне нужна помощь, мне нужно переместить все ненулевые значения в левую колонку, чтобы не было пробелов.Имена столбцов могут быть переименованы, например,

Name   Choice1   Choice2   Choice3   Choice4   Choice5   Choice6
------ --------- --------- --------- --------- --------- ----------
Amy    History
Beth   Speech    Physics   History
Bill   Algebra   Speech    Physics
Scott  Algebra   Physics
Steve  Speech    History

. Я могу сделать это, выбрав сводную таблицу во временной таблице, а затем перебирая курсор для каждой строки / столбца, но я бы хотел этого избежать.Любые предложения приветствуются.

1 Ответ

5 голосов
/ 01 июня 2011

Предполагая SQL Server 2005 (как минимум), используя ROW_NUMBER(), чтобы упорядочить варианты:

SELECT Name, Choice1, Choice2, Choice3, Choice4, Choice5, Choice6  
FROM (
    SELECT 
        S.Name AS [NAME], 
        'Choice' + CAST(ROW_NUMBER() OVER(PARTITION BY S.Name ORDER BY S.Name, C.Period) AS VARCHAR) AS PIVOT_CODE, 
         C.Name as [Class]
    FROM Classes C
        JOIN StudentsClasses SC ON C.ClassID = SC.ClassID 
        JOIN Students S ON SC.StudentID = S.StudentID
    )
    AS data
    PIVOT 
    (  min([Class])  FOR [PIVOT_CODE] IN 
        (Choice1, Choice2, Choice3, Choice4, Choice5, Choice6)
    ) AS pvt
...