ORACLE纯SQL实现多行合并一行

Wesley13
• 阅读 839

项目中遇到一个需求,需要将多行合并为一行。
表结构如下:
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的结果,即为所要求的数据行

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

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

点赞
收藏
评论区
推荐文章
Jacquelyn38 Jacquelyn38
3年前
你肯定会用到的CSS多行多列布局
前言:因为项目中使用flex过程中,如果采用spacebetween两端对齐,会遇到最后一行难以对齐的问题。本文主要对多行多列这种常见的布局,列出解决方案,方便大家日常开发使用。话不多说,直接进入正题:方案一:标签补位我们都知道,之所以对不齐是因为最后一行的子项目没有达到4个,spacebetween的对齐方式,自然会把中间空出来。既然如此,何不直接补
Wesley13 Wesley13
3年前
Mysql字段修饰符(约束)
(1).null和notnull  notnull不可以插入null,但可以插入空值。数值型、字符型、日期型都可以插入null,但只有字符型可以插入空值。  使用方法如下:mysqlcreatedatabasetest_db;QueryOK,1rowaffected(0.00sec)
Easter79 Easter79
3年前
SpringBoot自定义序列化的使用方式
场景及需求:项目接入了SpringBoot开发,现在需求是服务端接口返回的字段如果为空,那么自动转为空字符串。例如:\    {        "id":1,        "name":null    },    {        "id":2,        "name":"x
Stella981 Stella981
3年前
Leet Code 74 Search a 2D Matrix
写一个高效的算法,在m×n的二维矩阵中搜索一个值。矩阵有以下性质:每一行从左到右为升序。每一行的第一个数都比上一行最后一个数大。例如,有以下矩阵:\  \1,  3, 5, 7\,  \10,11,16,20\,  \23,30,34,50\\给定target3,返
Wesley13 Wesley13
3年前
oracle 聚合函数 LISTAGG ,将多行结果合并成一行
LISTAGG(列名,' 分割符号')oracle11g以上的版本才有的一个将指定列名的多行查询结果,用指定的分割符号 合并成一行显示:例如:表原始数据:!(https://oscimg.oschina.net/oscnet/8ea6493fe801ffe266338444d7e380ac15c.png)需求:将mb1\_Tr
Wesley13 Wesley13
3年前
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)
Wesley13 Wesley13
3年前
PHP二维数据排序,二维数据模糊查询
一、因为项目中的一个报表需要合并三个表的数据,所以分表查询再合并数据,利用PHP数组函数进行排序,搜索。三表合并后的数组结构如下:Array(0Array(history_id12sla_group_
Stella981 Stella981
3年前
SpringBoot自定义序列化的使用方式
场景及需求:项目接入了SpringBoot开发,现在需求是服务端接口返回的字段如果为空,那么自动转为空字符串。例如:\    {        "id":1,        "name":null    },    {        "id":2,        "name":"x
Wesley13 Wesley13
3年前
MySQL学习笔记4——DQL
DQL(数据查询语言)一、基本查询1.字段(列)控制1)查询所有列SELECT\FROM表名;\"\"表示查询所有列2)查询指定列SELECT列1\,列2,...,列n\FROM表名;3)让完全重复的记录只显示一次当查询结果中的多行记录一模一样时,只显示一行。一般查询所有列时
Stella981 Stella981
3年前
Python 为什么不用分号作终止符?
一般而言,编程语言中使用分号“;”来实现两种目的:1.作为语句分隔符:使用分号来分隔语句(statement),这样就能在一行代码中书写多条语句(一行多句)2.作为语句终止符:使用分号来终止语句,这样就能把多行代码识别为一条语句(一句多行)!(http://ww1.sinaimg.cn/large/68b02e3bgy1gf69zg92