【Oracle】LISTAGG 函数的使用

【Oracle】LISTAGG 函数的使用LISTAGG 函数介绍 listagg 函数是 Oracle11 2 推出的新特性 其主要功能类似于 wmsys wm concat 函数 即将数据分组后 把指定列的数据再通过指定符号合并 LISTAGG 使用 listagg 函数有两个参数 1 要合并的列名 2 自定义连接符号 LISTAGG 函数既是分析函数 也是聚合函数所以 它有两种用法 1 分析函数

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 test as( SELECT 'SNO-0010210' S_NO,'1002' ITEM_NO,'BruceLiu' CUS_NAME,'' TEL,'深圳' ADDRESS FROM DUAL UNION SELECT 'SNO-0010210' S_NO,'1003' ITEM_NO, 'CandySun' CUS_NAME,'' TEL, '南京' ADDRESS FROM DUAL UNION SELECT 'SNO-0010211' S_NO, '1003' ITEM_NO,'QianSan' CUS_NAME,'' TEL,'南京' ADDRESS FROM DUAL UNION SELECT 'SNO-0010212' S_NO,'1005' ITEM_NO,'HuiClear' CUS_NAME,'' TEL,'白银' ADDRESS FROM DUAL UNION SELECT 'SNO-0010212' S_NO,'1007' ITEM_NO,'CatBool' CUS_NAME,'' TEL,'重庆' ADDRESS FROM DUAL UNION SELECT 'SNO-0010212' S_NO,'1004' ITEM_NO,'Liability' CUS_NAME,'' TEL,'成都' ADDRESS FROM DUAL ) 

test

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; 

res1

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; 

res2

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/233400.html原文链接:https://javaforall.net

(0)
上一篇 2025年7月23日 下午3:01
下一篇 2025年7月23日 下午3:22


相关推荐

  • VMware卸载辛酸历程

    VMware卸载辛酸历程you 吐槽的就是 vmware 虚拟机的卸载 由于要虚拟机上面安装系统总是中断 只好重新安装 所以要卸载当前这个 vmware 在 windows 中的进程实在是太多了 而且关联的文件也是无比繁杂 就像昨天的 ubuntu windows 自带的软件和 360 根本卸载不了 只好手动删除了 可是它的安装文件在各个目录中 注册文件也分布在注册表的各个角落 每次安装新的虚拟机都提示要先卸载旧的 只好在网上查找各种方案

    2026年3月26日
    2
  • RTP 协议

    RTP 协议原博客地址:http://www.cnblogs.com/qingquan/archive/2011/07/28/2120440.html概述:实时传送协议(Real-timeTransportProtocol或简写RTP,也可以写成RTTP)是一个网络传输协议,它是由IETF的多媒体传输工作小组1996年在RFC1889中公布的。RTP协议详细说明了在互联网上传递音频和视频的标…

    2022年6月28日
    38
  • cefsharp教程_常见的数据分析方法有哪些

    cefsharp教程_常见的数据分析方法有哪些本节汇总一些关于cefsharp的使用方法,包括c#调用HTML页面中的js,也可以是HTML中的按钮调用c#的方法。汇总后,方便以后使用和查看。

    2025年11月25日
    7
  • FastClick遇到的坑及解决办法

    FastClick遇到的坑及解决办法最近产品妹子提出了一个体验issue——用iOS在手Q阅读书友交流区发表书评时,光标点击总是不好定位到正确的位置:如上图,具体表现是较快点击时,光标总会跳到textarea内容的尾部。只有当点击停留时间较久一点(比如超过150ms)才能把光标正常定位到正确的位置。一开始我以为是iOS原生的交互问题没太在意,但后来发现访问某些页面又是没有这种奇怪体验的。然后怀疑是否…

    2022年6月19日
    58
  • u盘0x8000FFFF_灾难性故障怎么卸载

    u盘0x8000FFFF_灾难性故障怎么卸载U盘出现两个分盘,原先是用了老毛桃的工具重置了U盘,目前成了两个分区。想要修改分区的时候,出现了磁盘已被保护。第一步,按照贴中的第二个方法用修改完注册表关机重启https://product.pconline.com.cn/itbk/software/dnyw/1707/9686607.html第二步,去磁盘管理中把剩余的磁盘都删除掉,这时候u盘的所有的空间都没有了,点击新建文件会出现0x80…

    2026年3月9日
    7
  • PHP 17: MySQL的简单介绍

    PHP 17: MySQL的简单介绍

    2021年7月23日
    60

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号