Oracle如何按user、group分组将多行数据合并为逗号分隔单行?
Oracle按指定字段分组拼接字符串查询实现
适用11g R2及以上版本(官方推荐方案)
可以直接使用Oracle官方提供的聚合函数LISTAGG实现需求,示例代码如下:
SELECT "USER", "GROUP", LISTAGG(SUB, ',') WITHIN GROUP (ORDER BY SUB) AS SUB FROM 你的表名 GROUP BY "USER", "GROUP";
语法说明:
LISTAGG的第一个参数为需要拼接的字段,第二个参数为拼接使用的分隔符WITHIN GROUP (ORDER BY SUB)用来指定拼接时的字段排序规则,如果不需要按SUB大小排序,可替换为其他排序字段,也可以写ORDER BY NULL不指定排序规则
适用10g及更低版本(临时测试可用)
低版本Oracle可使用未公开的内置函数WM_CONCAT实现,示例代码如下:
SELECT "USER", "GROUP", WM_CONCAT(SUB) AS SUB FROM 你的表名 GROUP BY "USER", "GROUP";
注意:
WM_CONCAT是Oracle未对外公开的函数,没有官方兼容性保障,高版本Oracle已移除该函数,禁止在生产环境使用。
额外说明
USER、GROUP属于Oracle的保留关键字,作为表字段使用时必须用双引号包裹,否则会触发语法错误- 如果你需要对拼接的SUB值去重,Oracle 19c及以上版本可直接使用
LISTAGG(DISTINCT SUB, ',')语法,更低版本需要先对原表数据按三个字段去重后再执行聚合操作
内容的提问来源于stack exchange,提问作者Godnyl Pula
相关产品推荐
相关产品推荐

