如何对SQL表中相同分组的指定列值进行拼接合并
SQL查询实现同组数值拼接
你的需求是将数据表中col1和col2取值相同的行,把对应的value字段用逗号拼接合并,同时保留该组中最小的id值。以下是不同数据库环境下的实现语句:
MySQL/MariaDB
SELECT MIN(id) AS id, col1, col2, GROUP_CONCAT(value ORDER BY value SEPARATOR ',') AS merged_values FROM your_table GROUP BY col1, col2;
- 说明:通过
GROUP BY col1, col2对相同组合的行分组,MIN(id)提取每组最小的id,GROUP_CONCAT按value顺序拼接数值,用逗号分隔。
PostgreSQL
SELECT MIN(id) AS id, col1, col2, STRING_AGG(value::TEXT, ',' ORDER BY value) AS merged_values FROM your_table GROUP BY col1, col2;
- 说明:PostgreSQL使用
STRING_AGG实现字符串聚合,需要将数值类型的value转为文本类型,同时指定排序规则。
SQL Server
2017及以上版本(支持STRING_AGG)
SELECT MIN(id) AS id, col1, col2, STRING_AGG(value, ',' ) WITHIN GROUP (ORDER BY value) AS merged_values FROM your_table GROUP BY col1, col2;
旧版本(使用FOR XML PATH)
SELECT MIN(t.id) AS id, t.col1, t.col2, STUFF(( SELECT ',' + CAST(value AS VARCHAR) FROM your_table WHERE col1 = t.col1 AND col2 = t.col2 ORDER BY value FOR XML PATH(''), TYPE ).value('.', 'VARCHAR(MAX)'), 1, 1, '') AS merged_values FROM your_table t GROUP BY t.col1, t.col2;
- 说明:旧版本通过子查询结合
FOR XML PATH生成拼接字符串,再用STUFF去掉开头多余的逗号。
Oracle
SELECT MIN(id) AS id, col1, col2, LISTAGG(value, ',') WITHIN GROUP (ORDER BY value) AS merged_values FROM your_table GROUP BY col1, col2;
- 说明:Oracle使用
LISTAGG函数完成聚合拼接,支持指定排序和分隔符。
内容的提问来源于stack exchange,提问作者developeruser
相关产品推荐
相关产品推荐

