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一次性搞定,
而且扩充性很好,没有列的限制。

1SELECT n_sec_code, TRANSLATE (LTRIM (text, '/'), '*/', '*,') researcherList 2 FROM (SELECT ROW_NUMBER () OVER (PARTITION BY n_sec_code ORDER BY n_sec_code, 3 lvl DESC) rn, 4 n_sec_code, text 5 FROM (SELECT n_sec_code, LEVEL lvl, 6 SYS_CONNECT_BY_PATH (c_researcher_code,'/') text 7 FROM (SELECT n_sec_code, c_researcher_code as c_researcher_code, 8 ROW_NUMBER () OVER (PARTITION BY n_sec_code ORDER BY n_sec_code,c_researcher_code) x 9 FROM m_researcher_stock_rel 10 ORDER BY n_sec_code, c_researcher_code) a 11 CONNECT BY n_sec_code = PRIOR n_sec_code AND x - 1 = PRIOR x)) 12 WHERE rn = 1 13ORDER 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的结果,即为所要求的数据行

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

源地址:http://www.cnblogs.com/heekui/archive/2009/07/30/1535516.html

点赞
收藏

评论区

加载中...

相关推荐

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

Mysql字段修饰符(约束)

(1).null和notnull  notnull不可以插入null,但可以插入空值。数值型、字符型、日期型都可以插入null,但只有字符型可以插入空值。  使用方法如下:mysqlcreatedatabasetest_db;QueryOK,1rowaffected(0.00sec)

SpringBoot自定义序列化的使用方式

场景及需求:项目接入了SpringBoot开发,现在需求是服务端接口返回的字段如果为空,那么自动转为空字符串。例如:\    {        "id":1,        "name":null    },    {        "id":2,        "name":"x

Leet Code 74 Search a 2D Matrix

写一个高效的算法,在m×n的二维矩阵中搜索一个值。矩阵有以下性质:每一行从左到右为升序。每一行的第一个数都比上一行最后一个数大。例如,有以下矩阵:\  \1,  3, 5, 7\,  \10,11,16,20\,  \23,30,34,50\\给定target3,返

oracle 聚合函数 LISTAGG ,将多行结果合并成一行

LISTAGG(列名,' 分割符号')oracle11g以上的版本才有的一个将指定列名的多行查询结果,用指定的分割符号 合并成一行显示:例如:表原始数据:!(https://oscimg.oschina.net/oscnet/8ea6493fe801ffe266338444d7e380ac15c.png)需求:将mb1\_Tr

mysql select将多个字段横向合拼到一个字段

表模式:CREATE TABLE tbl_user (  id int(11) NOT NULL AUTO_INCREMENT,  name varchar(255) DEFAULT NULL,  age int(11) DEFAULT NULL,  PRIMARY KEY (id)