如何在SQL中执行Group By并将分组内所有值转为列表?
按分组合并列值为列表的SQL实现
针对你需要按col1和col2分组,将每组的col3值合并为列表的需求,不同SQL数据库的实现方式如下:
MySQL/MariaDB
使用GROUP_CONCAT()函数拼接值,再通过CONCAT()添加方括号:
SELECT col1, col2, CONCAT('[', GROUP_CONCAT(col3 SEPARATOR ', '), ']') AS col3 FROM your_table GROUP BY col1, col2;
执行结果与你期望的格式一致:
col1 col2 col3 a john [c, l] a mike [m] b Karl [i, j]
PostgreSQL
直接用ARRAY_AGG()生成数组形式的结果,默认就是带方括号的格式:
SELECT col1, col2, ARRAY_AGG(col3 ORDER BY col3) AS col3 FROM your_table GROUP BY col1, col2;
如果需要字符串形式的拼接结果,可使用STRING_AGG():
SELECT col1, col2, CONCAT('[', STRING_AGG(col3, ', '), ']') AS col3 FROM your_table GROUP BY col1, col2;
SQL Server
SQL Server 2017及以上版本支持STRING_AGG()函数,写法简洁:
SELECT col1, col2, CONCAT('[', STRING_AGG(col3, ', '), ']') AS col3 FROM your_table GROUP BY col1, col2;
若使用更早版本,可通过FOR XML PATH的方式实现拼接:
SELECT DISTINCT col1, col2, CONCAT('[', STUFF((SELECT ', ' + col3 FROM your_table t2 WHERE t2.col1 = t1.col1 AND t2.col2 = t1.col2 FOR XML PATH('')), 1, 2, ''), ']') AS col3 FROM your_table t1;
Oracle
Oracle 11g及以上版本推荐使用LISTAGG()函数:
SELECT col1, col2, CONCAT('[', LISTAGG(col3, ', ') WITHIN GROUP (ORDER BY col3), ']') AS col3 FROM your_table GROUP BY col1, col2;
对于Oracle 10g及更早版本,可使用非官方的WM_CONCAT()函数(注意兼容性):
SELECT col1, col2, CONCAT('[', WM_CONCAT(col3), ']') AS col3 FROM your_table GROUP BY col1, col2;
内容的提问来源于stack exchange,提问作者user12314164
相关产品推荐
相关产品推荐

