ORACLE纯SQL实现多行合并一行

项目中遇到一个需求,需要将多行合并为一行。
表结构如下:
NAME                            Null           Type
------------------------   ---------   -----
N_SEC_CODE                 NOT NULL  CHAR(6)
C_RESEARCHER_CODE   NOT NULL  VARCHAR2(20)

此表保存了“股票”与“研究员”的对应关系数据,一般而言,对于同一只股票而言,可能有多个研究员
对其进行跟踪研究。所以目前遇到一个要求,需查询出每只股票和对应的研究员(研究员代码间,使用逗号分隔)。
例如有如下数据:
000297                                    chenpeng            
000297                                    liusu               
合并处理后需显示为:
000297                                    chenpeng,liusu

网上查了很多方法,但通常而言都是编写自定义多行文本合并函数,或者对支持的列数具有局限性。
最后在英文google中搜到如下比较巧的方法。不用在数据库中增加function,纯SQL一次性搞定,
而且扩充性很好,没有列的限制。


SELECT   n_sec_code, TRANSLATE (LTRIM (text, '/'), '*/', '*,') researcherList
    FROM (SELECT ROW_NUMBER () OVER (PARTITION BY n_sec_code ORDER BY n_sec_code,
                  lvl DESC) rn,
                 n_sec_code, text
            FROM (SELECT     n_sec_code, LEVEL lvl,
                             SYS_CONNECT_BY_PATH (c_researcher_code,'/') text
                        FROM (SELECT   n_sec_code, c_researcher_code as c_researcher_code,
                                       ROW_NUMBER () OVER (PARTITION BY n_sec_code ORDER BY n_sec_code,c_researcher_code) x
                                  FROM m_researcher_stock_rel
                              ORDER BY n_sec_code, c_researcher_code) a
                  CONNECT BY n_sec_code = PRIOR n_sec_code AND x - 1 = PRIOR x))
   WHERE rn = 1
ORDER BY n_sec_code;

预想的结果成功出现,多行数据成功汇总到一行,特此分享与大家。对于你自己的应用中,只需要把SQL中“n_sec_code”
换为你的用来汇总的列,“c_researcher_code”替换为需合并文本的列,“m_researcher_stock_rel”替换为你的表名,就是这么简单。

SQL分析:
1、利用 “ROW_NUMBER () OVER (PARTITION BY……” 为按“股票代码”汇总后的数据行添加组内序号
2、“SYS_CONNECT_BY_PATH”  按组内序号相邻关系,为每一层进行不同行的“研究员代码”叠加
3、再次利用“股票代码”进行组内分组,但按第二部中的层次排倒序,增加调整后等级
4、取所有调整后等级为1的结果,即为所要求的数据行

方法很巧妙,值得学习。:-)

感谢网友@OctoberOne、@ericqliu的指点,在ORACLE10中可使用以下方法:
SELECT n_sec_code, wmsys.wm_concat (c_researcher_code) as result
FROM m_researcher_stock_rel
GROUP BY n_sec_code

posted on 2017-02-07 10:53 smile_elims 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/liangbo-/p/6373113.html

ORACLE纯SQL实现多行合并一行相关推荐

  1. Oracle 多行合并一行 方法

    http://lovejuan1314.iteye.com/blog/413694 NOTE:特别声明一下内容转自网络 http://www.ningoo.net/html/2008/how_to_d ...

  2. Oracle的 listagg 函数,多行合并一行

    转自:https://blog.csdn.net/Huay_Li/article/details/81257655 --创建学校类型-年级表 create table SchoolGrade(scho ...

  3. easyui一行显示多行_easyui datagrid以及oracle中的多行合并一行

    页面显示: 前端代码: toolbar="#toolbar" rownumbers="true" singleSelect="true" f ...

  4. pandas多行合并一行_Pandas函数妙用

    ❝ 文章来源:towardsdatascience 作者:Soner Yıldırım 翻译\编辑:Python大数据分析 ❞ 看标题是否似曾相似?之前为大家介绍过10个高效的pandas函数,颇受欢 ...

  5. SQL技巧(多行合并一列)

    DECLARE @NAMES VARCHAR(1000) SELECT @NAMES = ISNULL(@NAMES+',','')+ColumnCode FROM  DB_TableColumns  ...

  6. oracle纯SQL更新插入clob类型字段

    句式: declarebname clob := 'select * from (SELECTorder by ad_code'; beginupdate dsy_t_query set Q_TABL ...

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

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

  8. [Oracle]行列转换(行合并与拆分)

    使用wmsys.wm_concat 实现行合并 在 Oracle  中, 将某一个栏位的多行数据转换成使用逗号风格的一行显示,可以使用函数  wmsys.wm_concat 达成. 这个在上一篇 or ...

  9. php表格增加一行数据,““vb中数据库内容输出到excel如何把表格第一行合并添加一个大标题...

    excel表格上面和下面都有行怎么在中间添加一行 excel表面和下面都有行怎么在中间添加一行的方法如下: 1.打开要处理的文档, 2.标定位到要插入的位置之后,比如要在2,3行之间插入,就定位到第3 ...

最新文章

  1. 面试官问:如果MySQL的自增 ID 用完了,怎么办?
  2. lammps linux运行命令,[转载]linux下 lammps的安装以及计算初步使用
  3. AC日记——积木大赛 洛谷 P1969
  4. java中文转拼音 多音字_java使用jpinyin汉语转拼音(支持多音字)
  5. Nginx CONTENT阶段 static模块
  6. 1.Spring Cloud Alibaba教程:简介
  7. WPF-21:WPF实现仿安卓的图案密码键盘(初级)
  8. LeetCode 1417. 重新格式化字符串
  9. Linux 莱特币Litcoin节点搭建
  10. 爬虫入门(简单网页信息爬取)
  11. 数学建模之规划模型(一)
  12. Mysql之sql注入
  13. 国外常用的论文检索网站有哪些?
  14. 声音采样率对声音事件分类的简单探究
  15. MaxListenersExceededWarning: Possible EventEmitter memory leak detected.警告的处理
  16. Git GitHub Gitee使用方法
  17. FPGA 之 时序分析
  18. AndroidStudio 使用ADB命令进行 WIFI调试
  19. luogu P3084 [USACO13OPEN]照片Photo
  20. iCal及iCalendar说明

热门文章

  1. shell中while循环案例
  2. android 继承dialog自定义对话框
  3. 为啥开发的文档能力是核心竞争力之一
  4. 持续集成工具Jenkins看这篇就够啦!
  5. 面试|图解kafka的高可用机制
  6. 记录一次壮烈牺牲的阿里巴巴面试
  7. 24.指针和引用的区别
  8. 3._FILE_和_LINE_
  9. Android --- 在Andoird应用程序中打开相册却没有图片(夜神模拟器)怎么办?
  10. oracle 取今日0时,Oracle 取得当天0时0分0秒和23时59分59秒