如何将拼接列生成的同一Sr#编号对应的多条记录合并为单条
按Sr#合并重复行并拼接Dispatch_comments字段的实现方案
要实现同Sr#的多条记录合并、对应Dispatch_comments字段内容用逗号分隔的需求,核心逻辑是对Sr#字段执行GROUP BY分组,再结合对应数据库的字符串聚合函数处理拼接后的字段即可。
不同数据库的实现代码
- MySQL 5.7及以上 / MariaDB:使用
GROUP_CONCAT函数
SELECT sr#, GROUP_CONCAT(Dispatch_comments SEPARATOR ', ') AS merged_dispatch_comments FROM ( -- 原有字段拼接逻辑作为子查询 SELECT sr#, created || ' // ' || OWNERLASTNAME || ' // ' || OWNERFIRSTNAME || ' // ' || DESCRIPTION || ' // ' || activitystatus || ' // ' || ACTIVITYSUBSTATUS || ' // ' || closeddate AS Dispatch_comments FROM smaxtable ) t GROUP BY sr#;
注意:如果拼接内容过长,可提前执行
SET group_concat_max_len = 102400;调整最大允许长度,避免内容被截断。
- Oracle 11gR2及以上:使用
LISTAGG函数
SELECT sr#, LISTAGG(Dispatch_comments, ', ') WITHIN GROUP (ORDER BY created) AS merged_dispatch_comments FROM ( SELECT sr#, created || ' // ' || OWNERLASTNAME || ' // ' || OWNERFIRSTNAME || ' // ' || DESCRIPTION || ' // ' || activitystatus || ' // ' || ACTIVITYSUBSTATUS || ' // ' || closeddate AS Dispatch_comments FROM smaxtable ) t GROUP BY sr#;
- PostgreSQL:使用
STRING_AGG函数
SELECT sr#, STRING_AGG(Dispatch_comments, ', ' ORDER BY created) AS merged_dispatch_comments FROM ( SELECT sr#, created || ' // ' || OWNERLASTNAME || ' // ' || OWNERFIRSTNAME || ' // ' || DESCRIPTION || ' // ' || activitystatus || ' // ' || ACTIVITYSUBSTATUS || ' // ' || closeddate AS Dispatch_comments FROM smaxtable ) t GROUP BY sr#;
- SQL Server 2017及以上 / Azure SQL:使用
STRING_AGG函数
SELECT sr#, STRING_AGG(Dispatch_comments, ', ') WITHIN GROUP (ORDER BY created) AS merged_dispatch_comments FROM ( SELECT sr#, CONCAT(created, ' // ', OWNERLASTNAME, ' // ', OWNERFIRSTNAME, ' // ', DESCRIPTION, ' // ', activitystatus, ' // ', ACTIVITYSUBSTATUS, ' // ', closeddate) AS Dispatch_comments FROM smaxtable ) t GROUP BY sr#;
注意事项
- 如果你实际业务用到多表关联,需要补全原查询的表别名定义和关联逻辑,避免语法报错。
- 可根据业务需要调整聚合函数内的排序规则,比如按创建时间、关闭时间排序,保证合并后的内容顺序符合预期。
内容的提问来源于stack exchange,提问作者Devaraj Mani Maran
相关产品推荐
相关产品推荐

