请教一个listagg和wmconcat关于null值的问题

原始数据如下(建表sql在文章底部):

目標:根据type进行分组,把楼栋名去重后用"/"进行拼接

 


再配合使用子查询和replace函数达到目的,sql如下:
 

 


附:表数据sql脚本如下:

对于将一列多值合并成一行问题oracle提供了wmsys.wm_concat和listagg和wmconcat函数处理此问题,下面我们以emp表中数据为例看看两函数的使用方法

假设我们需要统计每种job下面有哪些员工,要求在一行显礻员工姓名首先看看emp表中的数据:




wm_concat函数作用:除了处理多行合并问题,还给我们直接根据某个表的字段建立视图带来方便


下面我们看看茬分析函数中写partition by 与上述结果的有什么不同效果


注意点1:我们会发现pratition by 这种情况下ename值确实进行了合并,但记录数并没有去重

下面我们再以sum分析函数中写order by时看看其效果


注意2:此时是在job粒度上,根据order by 中的顺序做的累积

一大早来广图排了大半个钟的队总算占了个好位子。--

还是看例子吧。关于wm_concat聚合无法直接排序聚合的问题和oracle 11g的新函数listagg和wmconcat。

需要的结果是这样对gradenm列按gradeno列进行排序合并


這个时候很明显看到,wm_concat默认是没有办法给gradenm排序的当然你可以把from table的部分先查出进行排序,再进行wm_concat聚合我只能告诉你这样并没有什么卵用。

而且wm_concat默认是用逗号进行字符串拼接如果需求是别的分隔符,还得用replace去替换一下


通过分析函数的patition进行分区分组,然后排序是order by gradeno这样,嗯。看结果然后我们外面套上一层select 查询这个结果,按schooltype分组取grade最长的,就可以查到想要的结果了代码如下:

(3)当然,不可能就这麼结束了今天的主角其实是listagg和wmconcat函数,Oracle Database 11g开始提供的一个聚合函数配合分组实现上面的需求,代码和结果如下:

listagg和wmconcat() 可接收两个参数聚合列 和 分隔符,不写分隔符参数即无分隔符直接拼接

group by,分组按组统计。有用到分组的才需要

补充:wm_concat是在wmsys用户下的一个函数,是oracle的一个非公开的函数而且,wm_concat在前面几个版本中的返回值数据类型也不相同在新版本12c中更是直接被抛弃了。

所以日常开发中并不建议使用wm_concat。強行建议使用listagg和wmconcat要么就自己写个函数用。

我要回帖

更多关于 listagg和wmconcat 的文章

 

随机推荐