如何将行数据转列为列且保留同分支同角色的重复人员
解决SQL Pivot丢失同分支同角色重复人员的问题
你遇到的核心问题是Pivot依赖聚合函数(如MAX()),会对同一Branch+committee_type分组下的人员做聚合,导致重复值被覆盖。以下两种方案可以解决这个问题,根据你的Power BI展示需求选择:
方案1:将同角色人员合并为字符串(适合单元格内显示所有人员)
如果希望同一角色列下显示该分支的所有对应人员(用逗号/换行分隔),可以先把同分支同角色的人员合并成字符串,再执行Pivot:
适用于SQL Server 2017及以上版本(支持STRING_AGG)
SELECT Branch, President, Treasurer, Secretary, Role_Status FROM ( -- 先按分支、角色分组,合并人员为字符串 SELECT Branch, committee_type, Role_Status, STRING_AGG(official_name, ', ') WITHIN GROUP (ORDER BY official_name) AS member_list FROM 你的源表名 -- 替换为实际表名或临时表#pivot GROUP BY Branch, committee_type, Role_Status ) AS src PIVOT ( MAX(member_list) FOR committee_type IN ([President],[Treasurer],[Secretary]) ) AS PivotTable
适用于SQL Server 2016及以下版本(用XML拼接字符串)
SELECT Branch, President, Treasurer, Secretary, Role_Status FROM ( -- 用STUFF+XML PATH合并同分支同角色的人员 SELECT t1.Branch, t1.committee_type, t1.Role_Status, STUFF(( SELECT ', ' + t2.official_name FROM 你的源表名 t2 WHERE t2.Branch = t1.Branch AND t2.committee_type = t1.committee_type AND t2.Role_Status = t1.Role_Status ORDER BY t2.official_name FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)'), 1, 2, '') AS member_list FROM 你的源表名 t1 GROUP BY t1.Branch, t1.committee_type, t1.Role_Status ) AS src PIVOT ( MAX(member_list) FOR committee_type IN ([President],[Treasurer],[Secretary]) ) AS PivotTable
方案2:保留每个人员单独一行(适合展开显示)
如果希望每个人员单独占一行,同一分支下对应角色列显示该人员、其他角色列留空,需要先给同分支同角色的人员添加分组序号,再执行Pivot:
-- 第一步:给同分支同角色的人员添加序号 SELECT Branch, official_name, committee_type, Role_Status, ROW_NUMBER() OVER(PARTITION BY Branch, committee_type ORDER BY official_name) AS rn INTO #temp_pivot FROM 你的源表名 -- 替换为实际表名或临时表#pivot -- 第二步:基于带序号的表执行Pivot SELECT Branch, President, Treasurer, Secretary, Role_Status FROM ( SELECT Branch, official_name, committee_type, Role_Status, rn FROM #temp_pivot ) AS src PIVOT ( MAX(official_name) FOR committee_type IN ([President],[Treasurer],[Secretary]) ) AS PivotTable ORDER BY Branch, rn -- 清理临时表 DROP TABLE #temp_pivot
这样处理后,同分支同角色的所有人员都会被保留,不会被聚合函数覆盖。
内容的提问来源于stack exchange,提问作者Biswanath Das
相关产品推荐
相关产品推荐

