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
相关产品推荐
相关产品推荐

