oracle 列转行 listagg()函数 详解

listagg() :   Oracle的列转行函数;

版本要求: 11.2 以上版本.

语法: 

listagg(iw.wfl_id,',') within group(order by ir.serno)

listagg(列名,' 分割符号') within group(order by 列值被拼接的顺序)

分组函数:

用法1:

select distinct ir.serno,ir.code,
LISTAGG(iw.wfl_id,',') within group(order by ir.serno) over (partition by ir.serno) wfl_name

from iqp_me_refuse_reasion ir, Iqp_ref_Wfl_Node iw 
where ir.serno = iw.reason_id;

用法2:

select ir.serno,ir.code,
LISTAGG(iw.wfl_id,',') within group(order by ir.serno) wfl_name

from iqp_me_refuse_reasion ir, Iqp_ref_Wfl_Node iw 
where ir.serno = iw.reason_id
group by ir.serno,ir.code;

得到结果集相同.

区别:

group by 后的列必须是查询的分组全部列.

partition by 查出的结果集是重复的,需要使用 distinct 进行显式去重.

对于查询结果非常复杂的业务场景,个人感觉使用 PARTITION BY 会更灵活一些;GROUP BY 由于其查询结果列必须出现在 GROUP BY 条件里边而显得有些臃肿,不够优雅。

partition by 可以理解为以什么来分区.

同 wm_concat() 函数的区别:

select ir.serno,ir.code,
to_char(wm_concat(iw.wfl_id)) wfl_name
from iqp_me_refuse_reasion ir, Iqp_ref_Wfl_Node iw 
where ir.serno = iw.reason_id
group by ir.serno,ir.code;

使用 wm_concat 函数,记得加上to_char. 不然会展现成 CLOB 字段.

个人建议: 11g 版本后使用 listagg 函数. 之前版本使用 wm_concat 函数.

以上结果集都是一样:

-- 工作中用到,查阅资料后分享.

转载请说明出处.

 

 

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值