Oracle 列数据聚合方法汇总
网上流传众多列数据聚合方法,现将各方法整理汇总,以做备忘。
wm_concat
该方法来自wmsys下的wm_concat函数,属于Oracle内部函数,返回值类型varchar2,最大字符数4000。随着版本的变更返回值类型可能会有改动,项目中使用时候最好在新的用户下创建一个函数。
使用方法:
select deptno,wm_concat(ename) from emp group by deptno;
排序方法(未必仅此一种写法):
select *
from (select wm_concat(ename) over(partition by deptno order by empno) val,
row_number() over(partition by deptno order by empno desc) rn,
a.*
from emp a)
where rn = 1;
如果仅是简单聚合数据,可以使用该函数,
优点:效率高。
缺点:
(1)、返回最大字符数4000;
(2)、行数据默认以逗号分隔,可以修改函数更改,但是函数一旦创建不能随意自定义分隔符;
(3)、排序实现复杂且效率低;
(4)、内部聚合混乱。比如:
select wm_concat(col1) col3,wm_concat(col2) col4 from tab;
返回的col3和col4里的聚合数据未必是一一对应的。
zh_concat
该函数是在wm_concat基础上修改返回值类型得到,可以返回clob类型数据,内部实现同wm_concat。优缺点同wm_concat。
listagg
11g新增函数,返回值varchar2,同样受4000字符数限制。但是可以排序,可以指定分隔符。
使用方法:
select deptno,listagg(ename,',') within group(order by empno) from emp group by deptno
优点:
(1)、可排序
(2)、可自定义分隔符
缺点:
(1)、仅11g之后版本可用
(2)、返回最大字符数4000
xmlagg
该方法通过将数据聚合成xml结构,再转换成varchar2或者clob类型。
使用方法:
select deptno,xmlagg(xmlparse(content ename||',' wellformed) order by empno).getstringVal() from emp group by deptno;
select deptno,xmlagg(xmlparse(content ename||',' wellformed) order by empno).getclobval() from emp group by deptno;
优点:
(1)、可排序
(2)、可返回clob类型容纳大数据量数据
(3)、可自定义分隔符
(4)、10g可用
缺点:
(1)、在不排序的情况下效率比wm_concat、zh_concat差
(2)、在排序情况下效率比listagg差
(3)、最终数据在后面或者前面会多一个分隔符,需要再做处理
sys_connect_by_path
借助connect by实现数据聚合。
实现方法:
select deptno, res
from (select rn, level, deptno, sys_connect_by_path(ename, ',') res,
connect_by_isleaf il
from (select row_number() over(partition by deptno order by empno) rn,a.*
from emp a)
start with rn = 1
connect by deptno = prior deptno
and prior rn = rn - 1)
where il = 1
该方法实现复杂,效率低下,这里不再讨论。
总结
不同场景下使用不同方法(最佳选择):
|
|
10g |
11g以上 |
|
排序(varchar2) |
xmlagg |
listagg |
|
排序(clob) |
xmlagg |
xmlagg |
|
不排序(varchar2) |
wm_concat |
wm_concat |
|
不排序(clob) |
zh_concat |
zh_concat |
Oracle 列数据聚合方法汇总的更多相关文章
- Oracle索引梳理系列(一)- Oracle访问数据的方法
版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...
- mssql sqlserver 将逗号分隔的一列数据转换为多列数据的方法分享
转自:http://www.maomao365.com/?p=10278 摘要: 下文讲述sqlserver中将使用逗号组合的单列数据,分隔为多列数据的方法 实验环境:sql server 2012 ...
- 恢复oracle数据库误删除数据的方法汇总
学习数据库时,我们只是以学习的态度,考虑如何使用数据库命令语句,并未想过工作中,如果误操作一下,都可能导致无可挽回的损失.当我在工作中真正遇到这些问题时,我开始寻找答案.今天主要以oracle数据库为 ...
- Android零基础入门第83节:Activity间数据传递方法汇总
在Activity间传递的数据一般比较简单,但是有时候实际开发中也会传一些比较复杂的数据,本节一起来学习更多Activity间数据的传递. 一.常用数据类型 在前面几节我们只学习了一些常用类型的数据传 ...
- Oracle 拼接列数据的方法
select wm_concat(fphone) phone from dq_phone_ndtbdxz wm_concat(列名):把多列值,合并成一列,用,隔开.
- asp.net中导出excel数据的方法汇总
1.由dataset生成 代码如下 复制代码 public void CreateExcel(DataSet ds,string typeid,string FileName) { Htt ...
- oracle 修改数据 保险方法
oracle 中修改比较安全的方法:(pl/sql) 第一种方法: select * from temp where id=9 for update; 第二种方法: select t.*,rowid ...
- Oracle 大数据查询优化方法
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...
- MySQL中快速复制数据表方法汇总
本文将着重介绍两个MySQL命令的组合,它将以原有数据表为基础,创建相同结构和数据的新数据表. 这可以帮助你在开发过程中快速的复制表格作为测试数据,而不必冒险直接操作正在运行 的数据表. 示例如下: ...
随机推荐
- TODO:Golang指针使用注意事项
TODO:Golang指针使用注意事项 先来看简单的例子1: 输出: 1 1 例子2: 输出: 1 3 例子1是使用值传递,Add方法不会做任何改变:例子2是使用指针传递,会改变地址,从而改变地址. ...
- 轻量级“集合”迭代器-Generator
Generator是PHP 5.5加入的新语言特性.但是,它似乎并没有被很多PHP开发者广泛采用.因此,在我们了解PHP 7对Generator的改进之前,我们先通过一个简单却显而易见的例子来了解下G ...
- ajax
常见的HTTP状态码状态码:200 请求成功.一般用于GET和POST方法 OK301 资源移动.所请求资源移动到新的URL,浏览器自动跳转到新的URL Moved Permanently304 未修 ...
- linux应用调试技术之GDB和GDBServer
1.调试原理 GDB调试是应用程序在开发板上运行,然后在PC机上对开发板上得应用程序进行调试,PC机运行GDB,开发板上运行GDBServer.在应用程序调试的时候,pc机上的gdb向开发板上的GDB ...
- HTML5轻松实现搜索框提示文字点击消失---及placeholder颜色的设置
在做搜索框的时候无意间发现html5的input里有个placeholder属性能轻松实现提示文字点击消失功能,之前还傻傻的在用js来实现类似功能... 示例 <form action=&quo ...
- PHP获取客户端IP
/** * 获取客户端IP */ function getClientIp() { $ip = 'unknown'; $unknown = 'unknown'; if (isset($_SERVER[ ...
- Html.DropDownLis绑定数据库
效果: 方法一: View: <div class="col-md-md-4"> <div class="input-group"> & ...
- AutoMapper的介绍与使用(一)
软件环境 vs2015 asp.net mvc 5 .NET Framework 4.5.2 AutoMapper 5.2.0.0 AutoMapper安装 新建asp.net mvc 项目 Auto ...
- 新手学习web遇到的一些乱码问题
在新手学习web网站学习的时候经常会遇到?????这种乱码,对于刚起步的菜鸟来说真的很头痛,很容易打击继续学的信心当然了对于菜鸟的我最近也遇到过乱码问题,沉浸其中不能自拔,爱的深啊!!!!!我所遇到的 ...
- 【从零开始学BPM,Day5】报表配置及自定义功能页面开发
[课程主题] 主题:5天,一起从零开始学习BPM [课程形式] 1.为期5天的短任务学习 2.每天观看一个视频,视频学习时间自由安排. [第五天课程] 1.课程概要 Step 1 软件下载:H3 BP ...