我第一次在这里阅读问题。
我在一所大学工作,我有一张学生证及其主管的表格,有些学生有一位主管,有些学生有两三位,这取决于他们的主题。
表格如下所示
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 :(得分: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)
。如果那是真正需要的话,我会把它留作练习。