如何在SQL中将多行转置为列

时间:2015-04-01 15:18:43

标签: sql sql-server-2008-r2 transpose

我第一次在这里阅读问题。

我在一所大学工作,我有一张学生证及其主管的表格,有些学生有一位主管,有些学生有两三位,这取决于他们的主题。

表格如下所示

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功能,但不认为它符合我的需要。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分: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的分配是由Supervisor-VARCHAR订购完成的。如果您希望以不同方式完成订购,则可能需要包含[订购]列;然后改为ROW_NUMBER() OVER(PARTITION BY ID ORDER BY [Ordering])。例如,[订购]列可以是INT IDENTITY(1,1)。如果那是真正需要的话,我会把它留作练习。