转自:https://blog.csdn.net/Huay_Li/article/details/81257655

--创建学校类型-年级表
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的 listagg 函数,多行合并一行相关推荐

  1. ORACLE纯SQL实现多行合并一行

    ORACLE纯SQL实现多行合并一行 项目中遇到一个需求,需要将多行合并为一行. 表结构如下: NAME                            Null           Type ...

  2. oracle的listagg函数

    今天需要将 BDST_ID相同的PROJECT_ID用逗号分隔拼成一个字符串,于是想到了oracle的listagg函数 表名为PM_BDST_PROJECT select tt.BDST_ID, l ...

  3. oracle的concat字符串太长,oracle 使用listagg函数后 字符串连接的结果过长

    oracle 使用listagg函数后 字符串连接的结果过长最终解决 SELECT r.department_id law_dept_id, ( SELECT xmlagg(xmlparse(cont ...

  4. 2020-11-02 oracle sql listagg函数使用

    listagg 函数的作用就是将多行记录合成一行记录 基础用法:listagg(a,b) within group(order by c) a指的是要进行拼接的字段, b指的是连接字段与字段之前的连接 ...

  5. 【Oracle】LISTAGG 函数的用法

    函数介绍 listagg函数是Oracle 11.2 c 版本推出的,用于数据分组后将指定列数据通过间隔符号拼接,将多行转为一行显示. 实际使用 以班级为单位,查询每个班级学生(同班学生显示在一行) ...

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

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

  7. Oracle的 wm_concat 的排序问题,Oracle的 listagg 函数

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

  8. 【Oracle】LISTAGG 函数的使用

    LISTAGG 函数介绍 listagg 函数是 Oracle 11.2 推出的新特性. 其主要功能类似于 wmsys.wm_concat 函数, 即将数据分组后, 把指定列的数据再通过指定符号合并. ...

  9. Oracle 中 LISTAGG 函数的介绍以及使用

    LISTAGG 函数介绍 listagg 函数是 Oracle 11.2 推出的新特性. 其主要功能类似于 wmsys.wm_concat 函数, 即将数据分组后, 把指定列的数据再通过指定符号合并. ...

最新文章

  1. MySQL Antelope和Barracuda的区别分析
  2. 纯CSS3制作的圆角效果按钮菜单
  3. 07 分支管理 —— Feature分支
  4. 两个有序数组的合并,python版
  5. boost::describe模块宏BOOST_DESCRIBE_PP_FOR_EACH的测试程序
  6. pdo mysql_PDO MySQL
  7. jaxb_JAXB众所周知的秘密
  8. 动态分配方式计算学生成绩
  9. python浪漫文艺_Python程序员的文艺之路
  10. uboot主Makefile之9——2589行 x210_sd_config目标
  11. 【BZOJ2194】快速傅里叶之二,FFT和一点奇怪的想法
  12. linux安装界面意思,为linux安装图形化界面
  13. 程序员未来会成为非常内卷式的职业吗?
  14. python学习笔记之数据类型(二)
  15. CCOMBOX下拉弹出框,因属性对话框自动隐藏而弹出框没有隐藏问题
  16. redis源码阅读—hyperloglog(基数统计)
  17. 免费邮箱怎么注册?创建注册邮箱帐号免费吗?
  18. leetcode 链表的中间结点
  19. 使用STM32F4定时器的ETR功能对外部脉冲进行计数
  20. SAS编程|ADAM阶段性小结

热门文章

  1. 3706 teradata 语句报错_TERADATA中函数的使用
  2. android连连看课设报告,宠物连连看课程设计报告
  3. rabbitmq的启停与异常
  4. 19位银行卡卡号检验源代码
  5. Linux IP in IP隧道简述
  6. pgsql——查询常用
  7. android 头部折叠,Android 头像折叠效果
  8. html+css (静态页面+动画案例)
  9. Agfa的MUSICA说明
  10. java测量麦克风音量_Android-使用mediarecorder类获取当前麦克风音量值