`

Oracle一个典型行列转换的几种实现方法

阅读更多

假如有如下表,其中各个i值对应的行数是不定的


SQL> select * from t;

I A D
———- ———- ——————-
1 b 2008-03-27 10:55:42
1 a 2008-03-27 10:55:46
1 d 2008-03-27 10:55:30
2 z 2008-03-27 10:55:55
2 t 2008-03-27 10:55:59

要获得如下结果,注意字符串需要按照D列的时间排序:

1 d,b,a
2 z,t

这是一个比较典型的行列转换,有好几种实现方法

 

1.自定义函数实现

create or replace function my_concat(n number)
return varchar2
is
type typ_cursor is ref cursor;
v_cursor typ_cursor;
v_temp varchar2(10);
v_result varchar2(4000):= ”;
v_sql varchar2(200);
begin
v_sql := ‘select a from t where i=’ || n ||’ order by d’;
open v_cursor for v_sql;
loop
fetch v_cursor into v_temp;
exit when v_cursor%notfound;
v_result := v_result ||’,’ || v_temp;
end loop;
return substr(v_result,2);
end;

SQL> select i,my_concat(i) from t group by i;

I MY_CONCAT(I)
———- ——————–
1 d,b,a
2 z,t

虽然这种方式可以实现需求,但是如果表t的数据量很大,i的值又很多的情况下,因为针对每个i值都要执行一句select,扫描和排序的次数和i的值成正比,性能会非常差。

2.使用sys_connect_by_path

select i,ltrim(max(sys_connect_by_path(a,’,')),’,') a
from
(
select i,a,d,min(d) over(partition by i) d_min,
(row_number() over(order by i,d))+(dense_rank() over (order by i)) numid
from t
)
start with d=d_min connect by numid-1=prior numid
group by i;

从执行计划上来看,这种方式只需要扫描两次表,比自定义函数的方法,效率要高很多,尤其是表中数据量较大的时候:
eplan1

3.使用wm_sys.wm_concat

这个函数也可以实现类似的行列转换需求,但是似乎没有办法做到直接根据另外一列排序,所以需要先通过子查询或者临时表排好序


SQL> select i,wmsys.wm_concat(a) from t group by i;

I WMSYS.WM_CONCAT(A)
———- ——————–
1 b,a,d
2 z,t

SQL> select i,wmsys.wm_concat(a)
2 from
3 (select * from t order by i,d)
4 group by i;

I WMSYS.WM_CONCAT(A)
———- ——————–
1 d,b,a
2 z,t

执行计划上看,只需要做一次表扫描就可以了,但是这个函数是加密过的,执行计划并不能显示函数内部的操作。

不知道大家还有没有更加高效的实现方式,欢迎指教^_^

其他一些方法,可以参考:
http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:2196162600402
http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:15637744429336

本文网址:http://www.ningoo.net/html/2008/how_to_do_string_aggregate_on_oracle.html

分享到:
评论

相关推荐

    通过SQL语句实现行列转换的几种方法

    ### 通过SQL语句实现行列转换的几种方法 在日常工作中,我们经常需要处理的数据结构并不总是按照我们期望的方式组织的。特别是在制作自定义报表或进行产品开发时,经常会遇到需要将数据从一种布局转换到另一种布局...

    oracle行列转换总结

    本文将深入探讨Oracle中实现行列转换的几种方法,包括使用`UNION ALL`、`MODEL`子句以及集合类型(`collections`),并提供具体的示例来帮助理解。 ### 1. 使用`UNION ALL`进行行列转换 `UNION ALL`是一种简单直接的...

    Oracle行列转换

    在数据库管理领域,Oracle是一个广泛使用的高性能关系型数据库系统。在处理数据时,有时我们需要将数据从行格式转换为列格式,或者反之,这一过程被称为“行列转换”。Oracle提供了多种方法来实现这样的转换,这对于...

    oracle行列转换例子

    本文将深入解析一个Oracle行列转换的例子,通过详细解释SQL语句的构成及其背后的逻辑,帮助读者理解如何在Oracle中实现行列转换。 ### Oracle行列转换例子解析 #### SQL语句结构分析 给定的SQL语句主要分为几个...

    oracle行列转换实例

    Oracle 提供了一种高效的方法,即使用分析函数来实现这种行列转换。分析函数主要设计用于处理累计计算等问题,但也可以用来解决行列转换这一常见需求。 1. 分析函数的基本概念 分析函数在 Oracle 数据库中扮演着...

    oracle行列转换

    以上两种方法是Oracle中实现行列转换的典型策略,它们各有优势:使用`DECODE`函数的聚合查询适用于数据源较为单一且需要汇总的情况;而使用`UNION`操作符则更适用于数据源多样,需要将多个查询结果整合的情况。根据...

    oracle sql 行列转换

    在Oracle SQL中,行列转换是一种常见的数据操作需求,主要用于将数据表中的行转换为列,或将列转换为行,以此来满足不同的数据展示或分析需求。这种转换在处理多维度数据、汇总数据或是进行复杂查询时特别有用。下面...

    Oracle中SQL语句行列之间相互转换

    通过以上介绍,我们可以看到在Oracle数据库中实现行列转换并不复杂,主要通过`UNPIVOT`和`PIVOT`操作来完成。这些操作不仅能够帮助我们更灵活地处理数据,还能够提高数据的可读性和分析效率。在实际应用中,应根据...

    ORACLE 行列转换

    通过上述方法,我们可以有效地在Oracle数据库中实现行列转换,无论是将多行数据转换为单行的多个列,还是将单行的多个列转换为多行数据。这不仅有助于数据分析和报告的生成,也提高了数据的可读性和可用性。

    Oracle 行列转换 总结

    Oracle 行列转换总结 Oracle 行列转换是指在 Oracle 数据库中将行与列之间进行转换的操作。这种转换有六种情况:列转行、行转列、多列转换成字符串、多行转换成字符串、字符串转换成多列、字符串转换成多行。 1. ...

    oracle行列转换的例子

    本文将通过一个具体的例子来详细介绍如何在Oracle数据库中实现行列转换。此方法不仅易于理解,而且非常实用,能够帮助用户快速掌握这一技巧。 #### 二、行列转换的基本原理 在开始之前,我们需要了解行列转换的...

    Oracle 行列转换总结

    本文档将详细讲解Oracle数据库中的行列转换方法,并通过具体实例来说明每一种转换方式的应用场景。 #### 二、列转行 **2.1 使用 UNION ALL 实现列转行** 适用于Oracle 8i、9i、10g及以上版本。 - **步骤与示例**...

    ORACLE 10g 的行列转换(学生科目成绩)测试题

    总之,Oracle 10g 提供的行列转换工具使得数据的展示和分析更为灵活,可以根据需求选择适合的方法进行操作。无论是PIVOT、UNPIVOT还是CASE语句配合GROUP BY,都能帮助我们有效地处理复杂的数据布局,提升数据处理...

    oracle连接java的几种方法

    本篇文章将详细介绍在Java中连接Oracle数据库的几种常见方法,以及相关的源码示例。 1. JDBC-ODBC桥连接: JDBC-ODBC桥是Java早期连接数据库的一种方式,它依赖于操作系统上的ODBC数据源。首先,你需要在系统中...

    oracle数据行列转换

    本篇文章将详细讲解Oracle 10g中的行列转换技术,包括如何实现行转列和列转行。 首先,我们要了解为什么要进行行列转换。在实际业务场景中,有时我们需要将多行数据合并到一列,或者将一列数据分散到多行,以适应...

    Oracle实现行列转换的方法分析

    本文将深入探讨Oracle中实现行列转换的几种方法。 首先,对于固定列数的行列转换,假设我们有一个学生成绩表,其中包含学生姓名、科目和分数。如果要将每个学生的各科成绩从多行展示转变为一行展示,可以使用Oracle...

    Oracle SQLServer行列转换

    ### Oracle SQLServer 行列转换知识点详解 #### 一、SQLServer 行转列...综上所述,无论是Oracle还是SQLServer,在实现行列转换时都有其独特的方法和技巧。开发者在实际应用中可以根据具体情况选择最适合的技术方案。

Global site tag (gtag.js) - Google Analytics