如何在SQL中分组合并行?仅可创建视图无法修改原表
多行拆分备注的SQL拼接方案(基于视图实现)
针对需要将同客户、同活动类型下拆分多行的备注按序号拼接的需求,不同SQL数据库有对应的实现方法,以下是主流数据库的具体方案:
MySQL/MariaDB
使用GROUP_CONCAT函数实现有序拼接:
CREATE VIEW customer_activity AS SELECT 客户ID, 活动类型, GROUP_CONCAT(备注 ORDER BY 序号 SEPARATOR '') AS 备注 FROM 原表名 GROUP BY 客户ID, 活动类型;
注意:
GROUP_CONCAT默认有字符串长度限制,若拼接后内容超长,需调整系统变量group_concat_max_len扩大上限。
SQL Server
2017及以上版本(支持STRING_AGG)
CREATE VIEW customer_activity AS SELECT 客户ID, 活动类型, STRING_AGG(备注, '') WITHIN GROUP (ORDER BY 序号) AS 备注 FROM 原表名 GROUP BY 客户ID, 活动类型;
2016及以下版本(使用FOR XML PATH)
CREATE VIEW customer_activity AS SELECT DISTINCT t.客户ID, t.活动类型, ( SELECT 备注 FROM 原表名 sub WHERE sub.客户ID = t.客户ID AND sub.活动类型 = t.活动类型 ORDER BY sub.序号 FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') AS 备注 FROM 原表名 t;
PostgreSQL
使用STRING_AGG函数直接实现有序拼接:
CREATE VIEW customer_activity AS SELECT 客户ID, 活动类型, STRING_AGG(备注, '' ORDER BY 序号) AS 备注 FROM 原表名 GROUP BY 客户ID, 活动类型;
Oracle
短字符串场景(使用LISTAGG)
CREATE VIEW customer_activity AS SELECT 客户ID, 活动类型, LISTAGG(备注, '') WITHIN GROUP (ORDER BY 序号) AS 备注 FROM 原表名 GROUP BY 客户ID, 活动类型;
超长字符串场景(使用XMLAGG)
当拼接后内容超过LISTAGG默认的4000字符限制时,改用XMLAGG:
CREATE VIEW customer_activity AS SELECT 客户ID, 活动类型, RTRIM( XMLAGG(XMLELEMENT(E, 备注) ORDER BY 序号).EXTRACT('//text()').GETCLOBVAL(), '' ) AS 备注 FROM 原表名 GROUP BY 客户ID, 活动类型;
通用注意事项
- 所有方案都依赖
序号列保证拼接顺序,需确保该列的排序逻辑正确。 - 部分聚合函数存在长度限制,超长内容需对应调整实现方式。
- 视图为实时计算,大表场景建议创建
客户ID+活动类型+序号的复合索引提升查询性能。
内容的提问来源于stack exchange,提问作者Shaun Bailey
相关产品推荐
相关产品推荐

