You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将行数据转列为列且保留同分支同角色的重复人员

解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 22:05:34