在SQL Server中使用Pivot对列进行收缩和分组

在SQL Server中使用Pivot对列进行收缩和分组,sql,sql-server,group-by,pivot,pivot-table,Sql,Sql Server,Group By,Pivot,Pivot Table,我有一个SQL表: DECLARE @team TABLE (Department VARCHAR(20),TeamMember1 VARCHAR(50),TeamMember2 VARCHAR(50),TeamMember3 VARCHAR(50)) INSERT INTO @team VALUES('CRM','Tom', 'Harry', 'Rodger') INSERT INTO @team VALUES('ERP','Boby', 'Simha', 'Wonder') INSERT

我有一个SQL表:

DECLARE @team TABLE (Department VARCHAR(20),TeamMember1 VARCHAR(50),TeamMember2 VARCHAR(50),TeamMember3 VARCHAR(50))

INSERT INTO @team VALUES('CRM','Tom', 'Harry', 'Rodger')
INSERT INTO @team VALUES('ERP','Boby', 'Simha', 'Wonder')
INSERT INTO @team VALUES('HR','Jack', 'John', 'Jim')

SELECT t.* FROM @team t
表的输出应该是

我的预期输出应为


我参考了很多教程,但我无法找到解决方案。所以,请帮助我。。。这是一个临时表,我需要在我的主项目中实现相同的逻辑。

首先,您应该知道,将团队成员存储在单独的列中是一种糟糕的数据格式。您想要的结果是更好的格式

如果您正在学习SQL,一个简单的解决方案是
UNION ALL

select Department, TeamMember1 as TeamMember from @team union all
select Department, TeamMember2 as TeamMember from @team union all
select Department, TeamMember3 as TeamMember from @team;
然而,在某些情况下,其他方法更有效。我倾向于使用:

select t.Department, v.TeamMember
from @team t outer apply
     (values (TeamMember1), (TeamMember2), (TeamMember3)) v(TeamMember);

您在其中定义了
t.TeamName
?@B.Balamanigandan。列名显示为
部门
SELECT t.*
FROM @team
CROSS APPLY (
    VALUES ('TeamMember1', TeamMember1)
         , ('TeamMember2', TeamMember2)
         , ('TeamMember3', TeamMember3)
) t(TeamName, TeamMember)