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

如何将一对多结果合并到单表?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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 16:36:20