2011-05-31 88 views
5

我已經減少一個複雜的模式的下列樣品複雜樞軸

學生

  • 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

回答

5

假設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