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

SQL单表多结果分组:合并同UniqueID的多行ItemType至单列

问题:合并同UniqueID的ItemType字段并保留其他列

我有一张表,每条记录对应一个条目,需将相同UniqueID的多行记录中ItemType字段值合并为单列结果输出。ItemType字段值各不相同,UniqueID与OtherData理论上绑定不会变化,但因表中数据超200万行,无法完全确认。我需要保留约5个其他列,仅合并ItemType列。尝试过SELECT DISTINCT和GROUP BY,结果不符合预期;STRING_AGG仅适用于MSSQL2017版本,求解决方案。

示例表

UniqueID | ItemType   | OtherData
----------------------------------
1234     | apples     | 123.1.123.1
1234     | oranges    | 123.1.123.1
2233     | red fish   | 123.5.67.2
1234     | grapes     | 123.1.123.1
2233     | blue fish  | 123.5.67.2

期望结果

UniqueID | ItemType                  | OtherData
-----------------------------------------------
1234     | apples, oranges, grapes   | 123.1.123.1
2233     | red fish, blue fish       | 123.5.67.2

解决方案

1. SQL Server 2017及以上版本(推荐)

使用STRING_AGG函数,通过GROUP BY保留需要的其他列。如果UniqueID对应的其他列(如OtherData)存在不一致的情况,用聚合函数(MAX()/MIN())确保返回唯一值:

SELECT
    UniqueID,
    STRING_AGG(ItemType, ', ') AS ItemType,
    MAX(OtherData) AS OtherData -- 替换为你需要保留的其他列,用MAX/MIN确保唯一值
    -- 继续添加其他需要保留的列,如MAX(Col1), MIN(Col2)等
FROM YourTableName
GROUP BY UniqueID

若能确认UniqueID与其他列一一绑定,直接GROUP BY所有需要保留的列即可:

SELECT
    UniqueID,
    STRING_AGG(ItemType, ', ') AS ItemType,
    OtherData
    -- 添加其他需要保留的列
FROM YourTableName
GROUP BY UniqueID, OtherData -- 所有非聚合的保留列都要加入GROUP BY

2. SQL Server 2016及以下版本

使用FOR XML PATH+STUFF组合实现字符串拼接,同时处理其他列的保留:

SELECT DISTINCT
    t.UniqueID,
    STUFF(
        (SELECT ', ' + ItemType
         FROM YourTableName
         WHERE UniqueID = t.UniqueID
         FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),
        1, 2, ''
    ) AS ItemType,
    t.OtherData
    -- 添加其他需要保留的列
FROM YourTableName t

如果需要处理其他列可能存在的不一致,先通过CTE确认UniqueID对应的其他列唯一值,再进行拼接:

WITH UniqueData AS (
    SELECT
        UniqueID,
        MAX(OtherData) AS OtherData -- 确保每个UniqueID对应唯一的OtherData
        -- 添加其他需要保留的列,用MAX/MIN处理
    FROM YourTableName
    GROUP BY UniqueID
)
SELECT
    ud.UniqueID,
    STUFF(
        (SELECT ', ' + ItemType
         FROM YourTableName t
         WHERE t.UniqueID = ud.UniqueID
         FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),
        1, 2, ''
    ) AS ItemType,
    ud.OtherData
    -- 添加其他从UniqueData中获取的列
FROM UniqueData ud

内容的提问来源于stack exchange,提问作者Ryan Barnes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 11:48:28