如何将相同id对应的多行文本数据合并转换为新列?
同ID多文本字段拼接实现方案
这个需求属于分组后字符串聚合场景,不需要使用PIVOT,直接使用对应数据库自带的分组聚合函数即可实现,假设你的源表名为source_table,各主流数据库实现方式如下:
- MySQL 实现
使用内置的GROUP_CONCAT函数,无分隔符直接拼接的写法如下:
SELECT id, GROUP_CONCAT(text SEPARATOR '') AS text2 FROM source_table GROUP BY id;
如果需要指定拼接顺序,可以在text后加ORDER BY规则,比如GROUP_CONCAT(text ORDER BY text ASC SEPARATOR '')。如果拼接内容较长超出默认长度限制,可以先执行SET SESSION group_concat_max_len = 1024000;调整当前会话的长度上限。
- PostgreSQL 实现
使用内置的STRING_AGG函数:
SELECT id, STRING_AGG(text, '') AS text2 FROM source_table GROUP BY id;
同样可以加ORDER BY指定拼接顺序:STRING_AGG(text, '' ORDER BY text ASC)。
SQL Server 实现
- 2017及以上版本:直接使用
STRING_AGG函数
SELECT id, STRING_AGG(text, '') WITHIN GROUP (ORDER BY id) AS text2 FROM source_table GROUP BY id;- 2017以下低版本:使用
FOR XML PATH语法实现
SELECT DISTINCT t1.id, STUFF(( SELECT '' + t2.text FROM source_table t2 WHERE t2.id = t1.id FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)'), 1, 0, '') AS text2 FROM source_table t1;- 2017及以上版本:直接使用
Oracle 实现
11gR2及以上版本使用LISTAGG函数:
SELECT id, LISTAGG(text, '') WITHIN GROUP (ORDER BY id) AS text2 FROM source_table GROUP BY id;
低版本可以使用未公开的WM_CONCAT函数,不推荐生产环境使用。
内容的提问来源于stack exchange,提问作者stormix
相关产品推荐
相关产品推荐

