`
jqs1124
  • 浏览: 44564 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Oracle, 多行合并, 纯SQL, 非函数

 
阅读更多

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


<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->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

分享到:
评论

相关推荐

    Oracle多行记录合并

    4. **自定义PL/SQL函数:** 对于更复杂的情况,可能需要编写自定义的PL/SQL函数来实现多行合并。这可以提供更大的灵活性,允许根据特定需求进行定制,比如在合并过程中进行特殊处理或者添加额外逻辑。 5. **`XMLAGG...

    oracle10g,9i多行合并一行函数

    ### Oracle 10g与9i中的多行合并为一行函数详解 在Oracle数据库系统中,经常需要将多个行的数据合并成单行显示,尤其是在处理报告或者需要将多个值组合成一个字符串的情况下。本文将详细介绍如何在Oracle 10g与9i...

    sql实现多行合并一行

    总结来说,通过巧妙地运用Oracle的`CONNECT BY`和`SYS_CONNECT_BY_PATH`函数,我们可以实现多行数据到一行的合并,这对于报告展示和数据分析非常实用。不过要注意的是,这种方法在大数据量下可能会有性能问题,因为...

    oracle多行合并一行

    ### Oracle多行合并为一行的方法 在Oracle数据库中,有时候我们需要将多行数据合并成一行进行展示或处理,尤其是在报表生成、数据展示等场景中。本文将详细介绍如何使用Oracle纯SQL语句实现这一功能,并通过具体...

    Oracle 多行记录合并_连接_聚合字符串的几种方法_oracle_脚本之家1

    可以使用自定义的PL/SQL函数,通过游标和循环来动态处理数据。例如,可以创建一个函数,接收表名和字段名作为参数,然后在函数内部处理连接字符串。这种方法可以适应任何表和字段,但编写和维护成本较高。 4. 一条...

    oracle实现多行合并的方法

    本文实例讲述了oracle实现多行合并的方法。分享给大家供大家参考。具体分析如下: 在写sql时,经常会有将某列的字段合并起来,比如将某人名下每个月的工资列示,但是每个人只能占一行。 像这种场景,可能用行列转换...

    Oracle 多行记录合并/连接/聚合字符串的几种方法

    在Oracle数据库中,合并多行记录的字符串是一个常见的需求,特别是在报表或数据分析中。这个问题涉及到字符串的连接和聚合,使得多个记录的某个字段值能够整合到一行。在Oracle中,虽然没有内置的聚合函数直接支持...

    Oracle字段转字符串/多行记录合并/连接/聚合字符串的几种方法

    `LISTAGG()`是Oracle 11g引入的一个聚合函数,用于将多行数据合并为一个字符串,特别适合于分组查询。它允许指定分隔符: ```sql SELECT column1, LISTAGG(column2, ', ') WITHIN GROUP (ORDER BY column2) FROM...

    PLSQL单行函数和组函数详解

    在Oracle的PL/SQL编程中,函数是极其重要的组成部分,它们用于处理和操作数据。本篇文章将详细讲解PL/SQL中的单行函数和组函数。 首先,单行函数是针对单行数据进行操作的函数,它们可以应用于SQL查询的不同部分,...

    Mysql、oracle、Sybase数据库两列合并成一列的sql语句

    本文将详细介绍如何在MySQL、Oracle以及Sybase三种主流数据库中使用SQL语句来完成两列数据的合并操作。 ### 1. MySQL中的两列合并 在MySQL中,可以使用`CONCAT()`函数或者连接运算符`+`来合并两个字段。但是,需要...

    Oracle多行记录字符串综合操作几种方法

    ### Oracle多行记录字符串综合操作几种方法 #### 引言 在Oracle数据库中,处理多行记录中的字符串是一项常见的需求,特别是在需要将多个值合并成一个字符串时。本文旨在介绍几种常用的多行记录字符串综合操作方法,...

    Oracle Sql基础 Oracle Sql基础 Oracle Sql基础

    - SQL函数是指那些能够接收一个或多个输入参数,并返回一个结果的内置函数。这些函数可以帮助用户在查询中执行复杂的计算或数据处理。 **3.3 SQL函数分类** - SQL函数可以分为单行函数和分组函数两大类。单行函数...

    oracle某个字段多行记录转化为一行

    为了实现将Oracle数据库中某个字段的多行记录合并成一行记录的目标,可以采用编写自定义函数的方法。下面详细介绍该方法的具体步骤: #### 创建函数 `f_m_t` 首先,创建一个名为`f_m_t`的函数,该函数接受一个参数...

    oracle将以逗号分隔字符串转多行

    在Oracle数据库中,将逗号分隔的字符串转换为多行是常见的数据处理需求,尤其在需要对每个分隔项进行单独操作时。这个过程通常涉及到字符串处理函数,如`REGEXP_SUBSTR`和`REPLACE`,以及层次查询结构`CONNECT BY`。...

    oracle SQL语法大全

    Oracle SQL,全称为结构化查询语言,是用于管理和操作Oracle数据库的强大工具。它允许用户查询、更新、插入和删除数据,以及创建和管理数据库对象。本资料“Oracle SQL语法大全”将全面涵盖Oracle SQL的基础概念、...

    oracle database 10g sql ebook-lib

    Oracle数据库10g是Oracle公司推出的数据库管理系统的一个重要版本,SQL(Structured Query Language)则是用于管理关系数据库的语言。本资源“oracle database 10g sql ebook-lib”显然是一本关于Oracle 10g数据库...

    oracle脚本 常用的数据库sql及pl\sql语言

    PL/SQL是Oracle提供的过程化编程语言,它结合了SQL的功能并增加了控制结构、异常处理和用户定义的函数、过程和包。 1. 块结构:PL/SQL由声明部分、执行部分和异常处理部分组成,如: ```sql DECLARE var1 数据类型...

Global site tag (gtag.js) - Google Analytics