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

如何在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, 活动类型;

通用注意事项

  1. 所有方案都依赖序号列保证拼接顺序,需确保该列的排序逻辑正确。
  2. 部分聚合函数存在长度限制,超长内容需对应调整实现方式。
  3. 视图为实时计算,大表场景建议创建客户ID+活动类型+序号的复合索引提升查询性能。

内容的提问来源于stack exchange,提问作者Shaun Bailey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 19:50:26