复杂枢轴

复杂枢轴

问题描述:

我已经减少一个复杂的模式的下列样品复杂枢轴

学生

  • StudentID INT,名称为varchar(50)
  • 1,比尔
  • 2,艾美
  • 3,Beth
  • 4,Scot吨
  • 5,史蒂夫

  • 的ClassID INT,名称为varchar(50),周期VARCHAR(50)
  • 1,代数,PERIOD1
  • 2 ,地理,Period3
  • 3,生物学,Period5
  • 4,物理,Period4
  • 5,语音PERIOD2
  • 6,历史,Period6

和结表

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 

我可以通过在每一行/列用光标选择枢轴到一个临时表,然后迭代,但我想避免这样做。任何建议,非常感谢。

+0

您正在使用什么数据库管理系统? – 2011-05-31 22:31:51

假设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 
+0

不错!我不知道这个构造,谢谢! – StuTheDog 2011-05-31 23:15:15

+0

很高兴能帮到你。 – rsbarro 2011-06-01 00:07:27