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

1、环境:

1、操作系统 windows 10

2、数据库:Oracle Database 11g r2

2、需求:

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

3、准备数据:

--创建学校类型-年级表
create table SchoolGrade(schoolType  varchar2(20), --学校类型gradeno     number(8),    --年级代码gradenm     varchar2(20)  --年级名称
);
--插入数据
insert into SchoolGrade (SCHOOLTYPE, GRADENO, GRADENM)
values ('小学', 101, '一年级');
insert into SchoolGrade (SCHOOLTYPE, GRADENO, GRADENM)
values ('小学', 102, '二年级');
insert into SchoolGrade (SCHOOLTYPE, GRADENO, GRADENM)
values ('小学', 103, '三年级');
insert into SchoolGrade (SCHOOLTYPE, GRADENO, GRADENM)
values ('小学', 104, '四年级');
insert into SchoolGrade (SCHOOLTYPE, GRADENO, GRADENM)
values ('小学', 105, '五年级');
insert into SchoolGrade (SCHOOLTYPE, GRADENO, GRADENM)
values ('小学', 106, '六年级');
insert into SchoolGrade (SCHOOLTYPE, GRADENO, GRADENM)
values ('初中', 201, '初一');
insert into SchoolGrade (SCHOOLTYPE, GRADENO, GRADENM)
values ('初中', 202, '初二');
insert into SchoolGrade (SCHOOLTYPE, GRADENO, GRADENM)
values ('初中', 203, '初三');
insert into SchoolGrade (SCHOOLTYPE, GRADENO, GRADENM)
values ('高中', 301, '高一');
insert into SchoolGrade (SCHOOLTYPE, GRADENO, GRADENM)
values ('高中', 302, '高二');
insert into SchoolGrade (SCHOOLTYPE, GRADENO, GRADENM)
values ('高中', 303, '高三');

数据是这个样子的 [学校类型,年级代码,年级名称]

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

4、实现

(1)wm_concat() 聚合,代码及结果如下:

select schooltype, wm_concat(gradenm) gradenmfrom schoolgradegroup by schooltype;

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

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

(2)尝试用wm_concat()over(partition by xx order by xx) 分析函数改进,代码及结果如下:

select schooltype, gradeno, wm_concat(gradenm) over(partition by schooltype order by gradeno) gradefrom schoolgrade a;

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

select schooltype, max(grade) gradefrom (select schooltype, gradeno, wm_concat(gradenm) over(partition by schooltype order by gradeno) gradefrom schoolgrade a)group by schooltype;

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

--listagg()within group(order by xx) oracle database 11g提供的新函数
select schooltype, listagg(gradenm, '、') within group(order by gradeno) gradenmfrom schoolgradegroup by schooltype;

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

within group(order by xx)里面的就是聚合列拼接顺序的排序,用法跟普通排序order by 一样。

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

****************************************

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

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

****************************************

看,世界如此的美丽。

Oracle的 wm_concat 的排序问题,Oracle的 listagg 函数相关推荐

  1. Oracle的 wm_concat 的排序问题,Oracle的 listagg 函数[转]

    一大早来广图排了大半个钟的队,总算占了个好位子.--2018-07-28 1.环境: 1.操作系统 windows 10 2.数据库:Oracle Database 11g r2 2.需求: 还是看例 ...

  2. oracle wm_concat 替换函数,Oracle 10g无法使用listagg函数的替代解决方案[wm_concat]

    LISTAGG函数介绍 LISTAGG函数是Oracle 11.2新增的函数,用于字符串拼接,11.2之前的版本无法使用,先来简单介绍一下listagg函数的使用 LISTAGG完整语法 以上是官方文 ...

  3. oracle 11g wm_concat 、 listagg 函数的使用(合并数据)

    方法一 wn_concat() 函数 1.把以下图中Name一样的数据合并为一条,而且NO的值要这样显示如 C.1,C.2 2.实现这种效果的操作如下,先把Name的值进行分组(group by),再 ...

  4. ORACLE 解决EN_CONCAT拼接结果不能自定义排序问题(listagg函数)-笔记

    需求需要把多行数据拼接为一行,而且要按顺序 一开始用的EN_CONCAT函数,数据拼接是没问题,可是排序却怎么也排不了,子查询呀,临时表啊都试了,但就是一group by 排序就乱 后来百度发现了li ...

  5. oracle vm concat指定分隔符,重写Oracle的wm_concat函数,自定义分隔符、排序

    oracle中,wm_concat函数是一个聚合函数,和mysql中的group_concat函数类似,不过group_concat函数比较强大,可以定义分隔符和排序,当然所谓强大是相对的,这里假使我 ...

  6. 重写Oracle的wm_concat函数,自定义分隔符、排序

    oracle中,wm_concat函数是一个聚合函数,和mysql中的group_concat函数类似,不过group_concat函数比较强大,可以定义分隔符和排序,当然所谓强大是相对的,这里假使我 ...

  7. listagg 函数--oracle 11g release 2

    http://xpchild.blog.163.com/blog/static/10180985920108485721969/ listagg 函数--oracle 11g release 2 20 ...

  8. oracle listagg方法,Oracle实现字符串拼接和分离功能的方法(LISTAGG函数),oraclelistagg...

    Oracle实现字符串拼接和分离功能的方法(LISTAGG函数),oraclelistagg 字符串拼接(String Aggregation Techniques)是数据处理时经常需要用到一个技术, ...

  9. oracle 11 wm concat,【Oracle开发】关于11.2上WMSYS.WM_CONCAT的workaround

    有很多人问关于新版本中WMSYS.WM_CONCAT函数无法使用的问题. 对于该函数,Oracle官方的态度是其从来没有将该函数列入任何官方文档中,这个函数仅仅是让Oracle Dev研发在针对内部对 ...

最新文章

  1. Java项目:图书管理系统(java+swing+Gui+Mysql)
  2. 你所不知道的 Transformer!
  3. 数据映射--跳表(skiplist)
  4. linux 命令都是bash,Linux 命令分类_bash基础特性
  5. Petapoco使用SQLite的异常问题
  6. Python第二天(字典)
  7. iPad最新型笔刷,足足五种分类,几百款
  8. 计算机绘图课程选用课本,机械制图课程学习指南.doc
  9. word中更新目录中只更新页码和更新整个目录的区别
  10. 一句话详解常见的心理学效应
  11. 偏差-方差分解(转)
  12. BrowserslistError: Unknown version 67 of android
  13. 揭秘短网址背后的灰色产业
  14. 不在被虐中成长就在被虐中死亡
  15. 名帖90 蔡襄 楷书《临锺繇帖卷》
  16. WGS84经纬度坐标6度分带高斯投影正算
  17. 五行代码实现MD5加密(超级简单,一看就会)
  18. Java垃圾回收的细节
  19. C语言中结构体直接赋值
  20. CANoe和CANoe.DiVa关于通信测试的简略汇总

热门文章

  1. 哈密瓜水果的文案,水果哈密瓜文案高级感
  2. ITIL 系列bussiness 1
  3. 数据库范式1NF 2NF 3NF详细阐述
  4. 罗克韦尔AB PLC RSLogix5000中定时器指令使用方法介绍
  5. laravel 使用队列进行微信模板消息的群发
  6. Win系统速览桌面功能失效 - 解决方案
  7. vue提示Named Route ‘News‘ has a default child route. When navigating to this named route...问题
  8. 【Jmeter操作步骤】
  9. PC版京东炸年兽活动一键做任务 全民自动炸年兽最新版1.1
  10. pdf转wordpptexceljpg图片pdf编辑器转换修改