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 函数.
以上结果集都是一样:
-- 工作中用到,查阅资料后分享.
转载请说明出处.