2015-04-01 38 views
1

我第一次在這裏閱讀一個問題。如何將多行轉換爲SQL中的列

我在一所大學工作,我有一張學生證及其上司的表格,其中一些學生有一名主管,一些有兩名或三名學生,具體取決於他們的學科。

的表看起來像這樣

ID Supervisor 
1 John Doe 
2 Peter Jones 
2 Sarah Jones 
3 Peter Jones 
3 Sarah Jones 
4 Stephen Davies 
4 Peter Jones 
4 Sarah Jones 
5 John Doe 

我希望創建一個輪流說這個一個觀點:

ID Supervisor 1 Supervisor 2 Supervisor 3 
1 John Doe   
2 Peter Jones  Sarah Jones 
3 Peter Jones  Sarah Jones 
4 Stephen Davies Peter Jones  Sarah Jones 
5 John Doe   

我已經看過PIVOT功能,但不認爲這符合我的需要。

任何幫助,非常感謝。

+0

學生獲得第四名主管時會發生什麼?當他們獲得第937位主管時會發生什麼? – gvee 2015-04-01 15:23:42

+0

我認爲你正在尋找像這樣的東西。 http://stackoverflow.com/questions/194852/concatenate-many-rows-into-a-single-text-string – 2015-04-01 15:25:36

+2

此外,你使用什麼DBMS? SQL Server,MySQL等? – gvee 2015-04-01 15:33:56

回答

0

PIVOT是正確的線索,只需要一點點「額外」 :)

DECLARE @tt TABLE (ID INT,Supervisor VARCHAR(128)); 
INSERT INTO @tt(ID,Supervisor) 
VALUES 
(1,'John Doe'), 
(2,'Peter Jones'), 
(2,'Sarah Jones'), 
(3,'Peter Jones'), 
(3,'Sarah Jones'), 
(4,'Stephen Davies'), 
(4,'Peter Jones'), 
(4,'Sarah Jones'), 
(5,'John Doe'); 

SELECT 
    * 
FROM 
    (
     SELECT 
      ID, 
      'Supervisor ' + CAST(ROW_NUMBER() OVER(PARTITION BY ID ORDER BY Supervisor) AS VARCHAR(128)) AS supervisor_id, 
      Supervisor 
     FROM 
      @tt 
    ) AS tt 
    PIVOT(
     MAX(Supervisor) FOR 
     supervisor_id IN ([Supervisor 1],[Supervisor 2],[Supervisor 3]) 
    ) AS piv; 

結果:

ID Supervisor 1 Supervisor 2 Supervisor 3 
1 John Doe  NULL   NULL 
2 Peter Jones  Sarah Jones  NULL 
3 Peter Jones  Sarah Jones  NULL 
4 Peter Jones  Sarah Jones  Stephen Davies 
5 John Doe  NULL   NULL 

你會發現,分配給Supervisor X是由訂貨完成監事,VARCHAR。如果您希望以不同方式完成排序,則可能需要包含[排序]列;然後更改爲ROW_NUMBER() OVER(PARTITION BY ID ORDER BY [Ordering])。例如[訂購]欄可能是INT IDENTITY(1,1)。如果這是真正需要的,我會把它作爲練習題給你。