假如有如下表,其中各个i值对应的行数是不定的

Sql代码  
  1. SQL> select * from t;
  2. I A          D
  3. ---------- ---------- -------------------
  4. 1 b          2008-03-27 10:55:42
  5. 1 a          2008-03-27 10:55:46
  6. 1 d          2008-03-27 10:55:30
  7. 2 z          2008-03-27 10:55:55
  8. 2 t          2008-03-27 10:55:59
  9. --- 要获得如下结果,注意字符串需要按照D列的时间排序:
  10. 1  d,b,a
  11. 2  z,t

这是一个比较典型的行列转换,有好几种实现方法

1.自定义函数实现

Sql代码  
  1. create or replace function my_concat(n number)
  2. return varchar2
  3. is
  4. type typ_cursor is ref cursor;
  5. v_cursor typ_cursor;
  6. v_temp varchar2(10);
  7. v_result varchar2(4000):= '';
  8. v_sql varchar2(200);
  9. begin
  10. v_sql := 'select a from t where i=' || n ||' order by d';
  11. open v_cursor for v_sql;
  12. loop
  13. fetch v_cursor into v_temp;
  14. exit when v_cursor%notfound;
  15. v_result := v_result ||',' || v_temp;
  16. end loop;
  17. return substr(v_result,2);
  18. end;
  19. SQL> select i,my_concat(i) from t group by i;
  20. I MY_CONCAT(I)
  21. ---------- --------------------
  22. 1 d,b,a
  23. 2 z,t

虽然这种方式可以实现需求,但是如果表t的数据量很大,i的值又很多的情况下,因为针对每个i值都要执行一句select,扫描和排序的次数和i的值成正比,性能会非常差。

2.使用sys_connect_by_path

Sql代码  
  1. select i,ltrim(max(sys_connect_by_path(a,',')),',') a
  2. from
  3. (
  4. select i,a,d,min(d) over(partition by i) d_min,
  5. (row_number() over(order by i,d))+(dense_rank() over (order by i)) numid
  6. from t
  7. )
  8. start with d=d_min connect by numid-1=prior numid
  9. group by i;

从执行计划上来看,这种方式只需要扫描两次表,比自定义函数的方法,效率要高很多,尤其是表中数据量较大的时候: 
 
3.使用wm_sys.wm_concat 
这个函数也可以实现类似的行列转换需求,但是似乎没有办法做到直接根据另外一列排序,所以需要先通过子查询或者临时表排好序:

Sql代码  
  1. SQL> select i,wmsys.wm_concat(a) from t group by i;
  2. I WMSYS.WM_CONCAT(A)
  3. ---------- --------------------
  4. 1 b,a,d
  5. 2 z,t
  6. SQL> select i,wmsys.wm_concat(a)
  7. 2  from
  8. 3  (select * from t order by i,d)
  9. 4  group by i;
  10. I WMSYS.WM_CONCAT(A)
  11. ---------- --------------------
  12. 1 d,b,a
  13. 2 z,t

执行计划上看,只需要做一次表扫描就可以了,但是这个函数是加密过的,执行计划并不能显示函数内部的操作。

转载于:https://www.cnblogs.com/lingbaozhangqian/p/3599962.html

oracle 多行合并成一行相关推荐

  1. mysql和sqlserver共存_mysql 和sqlserver的 多行合并成一行

    mysql 和sqlserver的 多行合并成一行 mysql  多行合并: mysql 内置函数 group_concat(exper  SEPARATOR " " ) expe ...

  2. ELK下logstash收集java日志,多行合并成一行

    介绍 使用codec的multiline插件实现多行匹配,这是一个可以将多行进行合并的插件,而且可以使用what指定将匹配到的行与前面的行合并还是和后面的行合并. 1.java日志收集测试 input ...

  3. [Pandas] 多行合并成一行

    美图欣赏2022/09/16 在最近的需求开发中,有如下需求需要进行修改,数据源demo如下所示 根据字段'material'进行分组,对字段'site'进行合并,内容之间用逗号(,)分隔,再进行去重 ...

  4. (总结)Linux下多行合并成一行,中间加分隔符

    将某个目录下的文件合并成一行,中间用冒号(:)作为分隔符 1.paste ls lib | sed 's@^@lib/@g' | paste -s -d ":" 2. tr ls  ...

  5. logstash收集java日志,多行合并成一行

    使用codec的multiline插件实现多行匹配,这是一个可以将多行进行合并的插件,而且可以使用what指定将匹配到的行与前面的行合并还是和后面的行合并. 1.java日志收集测试 input {s ...

  6. mysql多行合并成一行_数据文件合并与拆分

    [摘要] 本文介绍将多个文本文件和 Excel 文件合并成一个文件,或者将一个文件拆分成几个小文件时,如何处理会遇到的几种情况,并用 esProc SPL 举例实现. 在数据处理业务中,经常要把文件结 ...

  7. HTML 表格合并(表格合并行属性 rowspan 将多行合并成一行)

    <table border="1">        <tr>            <td colspan="3" >用户信 ...

  8. 怎么把好几行弄成一行_将多行内容合并成一行的两种方式

    在利用Unix操作系统在实现一些具体应用的时候,可能需要把某些显示的结果进行行与行之间的合并.如现在需要用Unix操作系统设计一个彩票软件,每一张彩票上最多可以打印五注内容.在Unix操作系统的数据文 ...

  9. Oracle多行数据合并成一行

    Oracle多行数据合并成一行 一.listagg 函数------(有长度限制) SELECT listagg(待拼接字段, ',') within group(ORDER BY 待拼接字段) AS ...

最新文章

  1. Alpha版本项目展示
  2. 哈工大成立人工智能研究院,NLP全国前三
  3. 神经网络检测三相电机缺相
  4. 红外防水摄像机相关配件选购小窍门
  5. Android - N级树形结构实现
  6. Java中可变长参数的使用及注意事项
  7. void与void*详解
  8. VMware vSphere 服务器虚拟化之十七 桌面虚拟化之安装View链接服务器
  9. 关于软件测试学习心得
  10. NeurIPS 2021 | 图像损坏场景下行人重识别新基准
  11. 科学与技术名词解释计算机病毒,名词解释计算机病毒
  12. android蓝牙设置特征属性,Android BLE蓝牙详细解读(二)
  13. linux使用中的问题 --- (防火墙iptables -F)
  14. Linux软件安装及修改软件源
  15. PLSQL Developer13破解汉化
  16. ISO-IEC 系列 国际标准组织官方标准文档 下载地址直达
  17. 已解决:不小心卸载pip后(重新安装pip的两种方式)
  18. 【专栏必读】王道考研408数据结构万字笔记、题目题型总结、注意事项、目录导航和思维导图
  19. vnc远程连接,5个步骤教你如何轻松实现vnc远程连接
  20. JAVA 处理带AM 或 PM的时间

热门文章

  1. Android工程师面试该怎么准备?年薪50W
  2. 【深度学习】论文EMO单眼识别分析
  3. python【数据结构与算法】战争之城(分支限界法)
  4. 【网页前端设计Front end】HTML语言基础.下(看不懂你来打我)
  5. Android移动开发之【Android实战项目】DAY2-使用Fragment实现底部菜单栏
  6. c语言程序设计迷宫,C语言程序设计课程设计-迷宫.doc
  7. 武汉网络推广介绍如何通过简化标题来提升主关键词排名?
  8. 网络推广网站解析为什么有些网站有收录却没流量?
  9. 网络营销外包——网络营销外包专员如何做好网站锚文本优化?
  10. 网络营销——网络营销专员浅析网站快照更新要点