如何将一对多结果合并到单表?GROUP与PIVOT用法咨询
解决TABLE1与TABLE2合并并转置重复行的问题
要实现将每个UserID对应的多个ParentID合并为列的需求,可通过行号生成+PIVOT转置的方式完成,以下是具体解决方案:
基础实现(匹配目标新表结构)
先给TABLE1中每个用户的ParentID分配序号,再通过PIVOT将行数据转成列:
SELECT UserID, Username, [1] AS [ParentID 1], [2] AS [ParentID 2] FROM ( -- 按UserID分组,给每个用户的ParentID分配递增序号 SELECT UserID, Username, ParentID, ROW_NUMBER() OVER (PARTITION BY UserID ORDER BY ParentID) AS ParentSeq FROM TABLE1 ) AS SourceData PIVOT ( -- 用MAX聚合,因为每个序号对应唯一的ParentID,不影响结果 MAX(ParentID) -- 将序号转成列名 FOR ParentSeq IN ([1], [2]) ) AS PivotedResult;
关联TABLE2获取Parent用户名(可选)
如果需要显示Parent对应的用户名而非ID,可在PIVOT结果基础上关联TABLE2:
SELECT p.UserID, p.Username AS [用户名称], t1.Username AS [Parent1名称], t2.Username AS [Parent2名称] FROM ( -- 先完成PIVOT得到每个用户的两个ParentID SELECT UserID, Username, [1] AS ParentID1, [2] AS ParentID2 FROM ( SELECT UserID, Username, ParentID, ROW_NUMBER() OVER (PARTITION BY UserID ORDER BY ParentID) AS ParentSeq FROM TABLE1 ) AS SourceData PIVOT ( MAX(ParentID) FOR ParentSeq IN ([1], [2]) ) AS PivotedResult ) p -- 关联TABLE2获取第一个Parent的用户名 LEFT JOIN TABLE2 t1 ON p.ParentID1 = t1.ParentID -- 关联TABLE2获取第二个Parent的用户名 LEFT JOIN TABLE2 t2 ON p.ParentID2 = t2.ParentID;
关键说明
ROW_NUMBER() OVER (PARTITION BY UserID ORDER BY ParentID):按UserID分组,给每个用户的ParentID分配序号,确保同一用户的不同ParentID能被转成独立列。- PIVOT操作:将行级的序号值转成列名,结合聚合函数完成行转列的转换。
内容的提问来源于stack exchange,提问作者Grantx
相关产品推荐
相关产品推荐

