SQL中如何根据id分组将指定列值拼接汇总到结果列
SQL按分组拼接同组列值的实现方案
不同数据库的分组字符串聚合函数没有统一的SQL标准,以下是主流数据库的对应实现,基于你提供的测试表(假设表名为user_info,包含id、col1两个字段)编写:
MySQL / MariaDB
使用内置GROUP_CONCAT()函数,默认分隔符为英文逗号,可自定义分隔符:SELECT id, GROUP_CONCAT(col1 SEPARATOR ', ') AS `values` FROM user_info GROUP BY id;注意该函数默认拼接长度上限为1024字符,若拼接内容超长,可调整
group_concat_max_len参数修改上限。如果需要控制拼接值的顺序,可在函数内加ORDER BY规则,例如GROUP_CONCAT(col1 ORDER BY col1 SEPARATOR ', ')。PostgreSQL
9.0及以上版本使用STRING_AGG()函数,直接指定分隔符即可:SELECT id, STRING_AGG(col1, ', ') AS values FROM user_info GROUP BY id;SQL Server
2017及以上版本支持STRING_AGG(),写法和PostgreSQL一致:SELECT id, STRING_AGG(col1, ', ') AS values FROM user_info GROUP BY id;2016及更早版本需要使用
FOR XML PATH兼容写法:SELECT t1.id, STUFF( (SELECT ', ' + col1 FROM user_info t2 WHERE t2.id = t1.id FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)'),1,2,'' ) AS values FROM user_info t1 GROUP BY t1.id;Oracle
11gR2及以上版本使用LISTAGG()函数,需要指定分组内的排序规则:SELECT id, LISTAGG(col1, ', ') WITHIN GROUP (ORDER BY col1) AS values FROM user_info GROUP BY id;
以上写法执行后,即可得到按id分组、同id下col1值拼接为新列的结果,和你给出的预期输出一致。
内容的提问来源于stack exchange,提问作者Charbel
相关产品推荐
相关产品推荐

