Oracle多行记录合并的几种方法

今天正好遇到需要做这个功能,顺手搜了一下网络,把几种方法都列出来,方便以后参考。

1 什么是合并多行字符串(连接字符串)呢,例如:

SQL> desc test;
Name Type Nullable Default Comments
------- ------------ -------- ------- --------
COUNTRY VARCHAR2(20) Y
CITY VARCHAR2(20) Y
SQL> select * from test;
COUNTRY CITY
-------------------- --------------------
中国 台北
中国 香港
中国 上海
日本 东京
日本 大阪
要求得到如下结果集:
------- --------------------
中国 台北,香港,上海
日本 东京,大阪

其实网友已经有一个汇总的解决方案了,如下

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

2 通过自定义函数的方法

这个方法比较灵活,随时可调用该函数,推荐使用,由于原网页代码有误,我这里再贴一遍

--?
CREATE OR REPLACE FUNCTION strcat (input VARCHAR2)
RETURN VARCHAR2 PARALLEL_ENABLE AGGREGATE USING strcat_type;
--?
create or replace type strcat_type as object
 (
 currentstr varchar2(4000),
 currentseprator varchar2(8),
 static function ODCIAggregateInitialize(sctx IN OUT strcat_type) return number,
 member function ODCIAggregateIterate(self IN OUT strcat_type,value IN VARCHAR2) return number,
 member function ODCIAggregateTerminate(self IN strcat_type,returnValue OUT VARCHAR2, flags IN number) return number,
 member function ODCIAggregateMerge(self IN OUT strcat_type,ctx2 IN strcat_type) return number)

--?
create or replace type body strcat_type is
 static function ODCIAggregateInitialize(sctx IN OUT strcat_type) return number is
 begin
 sctx := strcat_type(‘‘,‘,‘);
 return ODCIConst.Success;
 end;
 member function ODCIAggregateIterate(self IN OUT strcat_type,
value IN VARCHAR2) return number is
 begin
 if self.currentstr is null then
 self.currentstr := value;
 else
 self.currentstr := self.currentstr ||currentseprator || value;
 end if;
 return ODCIConst.Success;
 end;
 member function ODCIAggregateTerminate(self IN strcat_type,
 returnValue OUT VARCHAR2, flags IN number) return number is
 begin
 returnValue := self.currentstr;
 return ODCIConst.Success;
 end;
 member function ODCIAggregateMerge(self IN OUT strcat_type,
ctx2 IN strcat_type) return number is
 begin
 if ctx2.currentstr is null then
 self.currentstr := self.currentstr;
 elsif self.currentstr is null then
 self.currentstr := ctx2.currentstr;
 else
 self.currentstr := self.currentstr || currentseprator || ctx2.currentstr;
 end if;
 return ODCIConst.Success;
 end;

Oracle多行记录合并自定义函数STRCAT

3 行转列函数,wmsys.wm_concat()、LISTAGG()等

a WMSYS下的东西,一般功能不应该使用,

但我们也可以试试,如果查询出的值提示为CLOB的话,不要惊慌,前面再加一个to_char()就好了,具体参考

oracle合并列的函数wm_concat的使用详解

b 行转列函数listagg()还是不错的

下面这个例子,作者自己构造了一个表进行转换,合并行,当然也可以合并值,但不合并行,具体参考

Oracle 列转行函数 Listagg()

用系统自带的表进行演示下

------语句1
select cc.mgr,listagg(cc.ename,‘,‘) within GROUP (order by cc.mgr) from scott.emp cc group by cc.mgr
------语句2 请注意这两句查询结果的不同
select cc.mgr,listagg(cc.ename,‘,‘) within GROUP(order by cc.mgr) over (partition by cc.mgr) rank from scott.emp cc

结果如下

结果1

1    7566    FORD,SCOTT
2    7698    ALLEN,JAMES,MARTIN,TURNER,WARD

3    7782    MILLER

4    7788    ADAMS

5    7839    BLAKE,CLARK,JONES

6    7902    SMITH

7        KING

结果2

1    7566    FORD,SCOTT

2    7566    FORD,SCOTT

3    7698    JAMES,ALLEN,WARD,TURNER,MARTIN

4    7698    JAMES,ALLEN,WARD,TURNER,MARTIN

5    7698    JAMES,ALLEN,WARD,TURNER,MARTIN

6    7698    JAMES,ALLEN,WARD,TURNER,MARTIN

7    7698    JAMES,ALLEN,WARD,TURNER,MARTIN

8    7782    MILLER

9    7788    ADAMS

10    7839    BLAKE,JONES,CLARK

11    7839    BLAKE,JONES,CLARK

12    7839    BLAKE,JONES,CLARK

13    7902    SMITH

14        KING

网络资源,原作者可要求删除,谢谢

时间: 2024-10-05 04:50:04

Oracle多行记录合并的几种方法的相关文章

Oracle多行记录合并处理

1:效果如下图所示: 表T1: CREATE TABLE T1 ( WEEKWORKID VARCHAR2(20) , DD VARCHAR2(20) ) 表T2 CREATE TABLE T2 ( WEEKWORKID VARCHAR2(20) , NR VARCHAR2(20) ) SQL语句: select t2.weekworkid,t2.nr,T.dd from t2 left join ( -- 4筛选结果集 select weekworkid,max(substr(dd,2))dd

PHP中数组合并的两种方法及区别介绍

PHP数组合并两种方法及区别 如果是关联数组,如下: 复制代码代码如下: $a = array( 'where' => 'uid=1', 'order' => 'uid', ); $b = array( 'where' => 'uid=2', 'order' => 'uid desc', ); 1. array_merge,如果两个数组存在相同的key,后面的一个会覆盖前面的 复制代码代码如下: <?php $c = array_merge($a, $b); var_expo

Shell按行读取文件的3种方法

Shell按行读取文件的方法有很多,下面写出三种方法: 写法一: #!/bin/bash #描述: # while循环读行操作 #作者:孤舟点点 #版本:1.0 #创建时间:2017-11-09 04:08:52 PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH while read line do echo $line done < filename(待读取的文件) 写法二:

HBase统计表行数(RowCount)的四种方法

背景:对于其他数据存储系统来说,统计表的行数是再基本不过的操作了,一般实现都非常简单:但对于HBase这种key-value存储结构的列式数据库,统计 RowCount 的方法却有好几种不同的花样,并且执行效率差别巨大!下面来研究下吧~ 测试集群:HBase1.2.0 - CDH5.13.0 四台服务器 注:以下4种方法效率依次提高 一.hbase-shell的count命令这是最简单直接的操作,但是执行效率非常低,适用于百万级以下的小表RowCount统计! hbase> count 'ns1

oracle ORA_ROWSCN 行记录的更新时间

在这介绍两个oracle 10G开始提供的一个伪列ORA_ROWSCN,它又分为两种模式一种是基于block,这是默认的模式,还有一种是基于row上,这种模式只能在建里表时指定ROWDEPENDENCIES,不可以通过后期的alter table ,同时会给数据库带来性能负载每个Block在头部是记录了该block最近事务的SCN的,所以默认情况下,只需要从block头部直接获取这个值就可以了,不需要其他任何的开销,Oracle就能做到这一点.但是这明显第一种模式是scn是不准确的,因为不可能每

hive concat_w实现将多行记录合并成一行

建表如下: # 创建商品与促销活动的映射表 hive -e "set mapred.job.queue.name=pms; set hive.exec.reducers.max=32; set mapred.reduce.tasks=32; drop table if exists product_promotion; create table product_promotion(product_id bigint, promotion_id String); insert into table

SQL SERVER里行记录合并

在表PO中有以下列:PO#,Styel#,Color以及Quantity,其中同一个PO#可能会有不同的Style#,同一个PO#与Style#可能有不同的Color,现在要求是:把PO#与Style#相同的记录的Color与Quantity算出来,插入到一个新表中去,如:PO#        Style#        Color        QuantityA              01              Red          10A              01    

oracle数据的导入导出(两种方法三种方式)

大概了解数据库中数据的导入导出.在oracle中,导入导出数据的方法有两种,一种是使用cmd命令行的形式导入导出数据,另一种是使用PL/SQL工具导入导出数据. 1,使用cmd命令行导入导出数据 1.1整库导出 整库导出:exp 管理员账号/密码 full=y;//参数full表示整库导出.导出后会在当前目录下生成一个EXPDAT.DMP的文件,此文件为备份文件.如果想导出数据到指定位置,并且取个名字,需要添加file参数.例如:exp system/123456 file= C:\person

【转载】Python中如何高效实现两个字典合并,三种方法比较。

本文转载自:http://www.pythoner.com/13.html Python中将两个字典进行合并操作,是一个比较常见的问题.本文将介绍几种实现两个字典合并的方案,并对其进行比较. 对于这个问题,比较直观的想法是将两个字典做相加操作,赋值给结果字典,其代码为: 方法一: dictMerged1 = dict( dict1.items() + dict2.items() ) 然而,该方法合并时所用时间较长,效率更高的代码为: 方法二: dictMerged2 = dict( dict1,