Oracle中LISTAGG函数的介绍以及使用
Oracle中LISTAGG函数的介绍以及使⽤
LISTAGG 函数介绍
listagg 函数是 Oracle 11.2推出的新特性。
其主要功能类似于 wmsys.wm_concat 函数,即将数据分组后,把指定列的数据再通过指定符号合并。
LISTAGG 使⽤
listagg 函数有两个参数:
1、要合并的列名
2、⾃定义连接符号
☆LISTAGG 函数既是分析函数,也是聚合函数
所以,它有两种⽤法:
1、分析函数,如:row_number()、rank()、dense_rank()等,⽤法相似
listagg(合并字段,连接符) within group(order by 合并的字段的排序)over(partition by 分组字段)
2、聚合函数,如:sum()、count()、avg()等,⽤法相似
listagg(合并字段,连接符) within group(order by 合并字段排序)--后⾯跟 group by 语句
(补充)分析函数和聚合函数
⼀部分聚合函数其实也可以写成分析函数的形式。
分析函数和聚合函数本质上都是对数据进⾏分组,⼆者最⼤的不同便是:
对数据进⾏分组分组之后,
聚合函数只会每组返回⼀条数据,
⽽分析函数会针对每条记录都返回,
⼀部分分析函数还会对同⼀组中的数据进⾏⼀些处理(⽐如:rank()函数对每组中的数据进⾏编号);
还有⼀部分分析函数不会对同⼀组中的数据进⾏处理(⽐如:sum()、listagg()),这种情况下,分析函数返回的数据会有重复的,distinct 处理之后的结果与对应的聚合函数返回的结果⼀致。
LISTAGG 实例
先构造⼏笔临时数据
with as(
SELECT 'SNO-0010210' S_NO,'1002' ITEM_NO,'BruceLiu' CUS_NAME,'156********' TEL,'深圳' ADDRESS FROM DUAL
UNION
SELECT 'SNO-0010210' S_NO,'1003' ITEM_NO,'CandySun' CUS_NAME,'19745233214' TEL,'南京' ADDRESS FROM DUAL
UNION
SELECT 'SNO-0010211' S_NO,'1003' ITEM_NO,'QianSan' CUS_NAME,'19745233214' TEL,'南京' ADDRESS FROM DUAL
UNION
SELECT 'SNO-0010212' S_NO,'1005' ITEM_NO,'HuiClear' CUS_NAME,'19745233214' TEL,'⽩银' ADDRESS FROM DUAL
UNION
SELECT 'SNO-0010212' S_NO,'1007' ITEM_NO,'CatBool' CUS_NAME,'19745233214' TEL,'重庆' ADDRESS FROM DUAL
rank函数的用法UNION
SELECT 'SNO-0010212' S_NO,'1004' ITEM_NO,'Liability' CUS_NAME,'188********' TEL,'成都' ADDRESS FROM DUAL
)
LISTAGG 分析函数⽤法
SELECT T.S_NO,
LISTAGG(T.ITEM_NO,'/') WITHIN GROUP(ORDER BY T.S_NO, T.ITEM_NO) ITEM_NO,
LISTAGG(T.CUS_NAME,'/') WITHIN GROUP(ORDER BY T.S_NO, T.ITEM_NO) CUS_NAME,
LISTAGG(T.TEL,'/') WITHIN GROUP(ORDER BY T.S_NO, T.ITEM_NO) TEL,
LISTAGG(T.ADDRESS,'/') WITHIN GROUP(ORDER BY T.S_NO, T.ITEM_NO) ADDRESS
FROM test T
GROUP BY T.S_NO;
LISTAGG 聚合函数⽤法
SELECT T.S_NO,
LISTAGG(T.ITEM_NO,'/') WITHIN GROUP(ORDER BY T.S_NO, T.ITEM_NO)OVER(PARTITION BY T.S_NO) ITEM_NO, LISTAGG(T.CUS_NAME,'/') WITHIN GROUP(ORDER BY T.S_NO, T.ITEM_NO)OVER(PARTITION BY T.S_NO) CUS_NAME, LISTAGG(T.TEL,'/') WITHIN GROUP(ORDER BY T.S_NO, T.ITEM_NO)OVER(PARTITION BY T.S_NO) TEL,
LISTAGG(T.ADDRESS,'/') WITHIN GROUP(ORDER BY T.S_NO, T.ITEM_NO)OVER(PARTITION BY T.S_NO) ADDRESS
FROM test T;
好了,今天就到这⼉吧,⼩伙伴们点赞、收藏、评论,⼀键三连⾛起呀,我是⽼贺,我们下期见~~

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。