`
seandeng888
  • 浏览: 158101 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

Oracle实用功能之分组后列合并

阅读更多

1       实例解析

由于业务需求需要对表中的数据进行分组后进行合并的处理,鉴于Oracle10g没有现成的函数实现该功能,且该功能如若用JAVA代码实现会比较复杂,因此,特将SQL语言的实现方式分享出来,希望对大家有所帮助。如下:

test 数据如下:

ID,SUBJECTCODE,DIMCODE,VALUE

1 , 111111           ,A           ,10000

2,  222222           ,A           ,20000

3,  111111           ,B           ,30000

4,  222222           ,B           ,40000

5,  111111           ,C           ,60000

6,  222222           ,C           ,70000

7,  333333           ,A           ,80000

 实现方式如下:

select SUBJECTCODE,ltrim(max(sys_connect_by_path(VALUE,',')),',') AS VALUES from (
select SUBJECTCODE,VALUE,row_number() over(partition by SUBJECTCODE,order by SUBJECTCODE) rn,
from test
)
start with rn = 1 connect by rn - 1 = prior rn AND SUBJECTCODE=PRIOR SUBJECTCODE
group by SUBJECTCODE
order by SUBJECTCODE;

结果如下:

SUBJECTCODE ,VALUES

111111      10000, 30000, 60000

222222       20000,40000,70000

333333      80000

下面对如上实现的所用到的Start with connect by prior,SYS_CONNECT_BY_PATH, row_number() OVER进行介绍。

2       Start with connect by prior语句  

SELECT命令中使用CONNECT BYSTART WITH子句可以查询表中的树型结构关系。其命令格式如下:

SELECT… …

CONNECT BY {PRIOR列名1=列名2|列名1=PRIOR裂名2}

[START WITH]

其中:CONNECT BY子句说明每行数据将是按层次顺序检索,并规定将表中的数据连入树型结构的关系中。PRIOR运算符必须放置在连接关系的两列中某一个的前面。对于节点间的父子关系,PRIOR运算符在一侧表示父节点,在另一侧表示子节点,从而确定查找树结构的顺序是自顶向下还是自底向上。在连接关系中,除了可以使用列名外,还允许使用列表达式。START WITH子句为可选项,用来标识哪个节点作为查找树型结构的根节点。若该子句被省略,则表示所有满足查询条件的行作为根节点。

Start with...Connect By子句递归查询一般用于一个维护树形结构的应用。

3       SYS_CONNECT_BY_PATH

看了上面的内容,相信大家都能看懂下面的语句。

SELECT ename 
FROM scott.emp 
START WITH ename = 'KING'
CONNECT BY PRIOR empno = mgr;
得到结果为: 
KING   
JONES  
 
SCOTT  
 
ADAMS  
 
FORD  
 
SMITH  
 
BLAKE  
 
ALLEN  
 
WARD  
 
MARTIN  
 
TURNER  
 
JAMES 
而:
SELECT SYS_CONNECT_BY_PATH(ename, '>') "Path"   
 
FROM scott.emp   
 
START WITH ename = 'KING'   
 
CONNECT BY PRIOR empno = mgr;  
 
--
得到结果为:   
>KING  
 
>KING>JONES  
 
>KING>JONES>SCOTT  
 
>KING>JONES>SCOTT>ADAMS  
 
>KING>JONES>FORD  
 
>KING>JONES>FORD>SMITH  
 
>KING>BLAKE  
 
>KING>BLAKE>ALLEN  
 
>KING>BLAKE>WARD  
 
>KING>BLAKE>MARTIN  
 
>KING>BLAKE>TURNER  
 
>KING>BLAKE>JAMES  
 
>KING>CLARK  
 
>KING>CLARK>MILLER 
 

综上所述:SYS_CONNECT_BY_PATH函数的第一个参数是形成树形式的字段,第二个参数是父级和其子级分隔显示用的分隔符!

4       row_number() OVER

row_number() OVER (PARTITION BY COL1 ORDER BY COL2) 表示根据COL1分组,在分组内部根据COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号

示例: 
COL1   COL2     row_num 
A      1700     1 
A      1800     2 
B      1085     1 
B      1710     2

1
0
分享到:
评论
2 楼 seandeng888 2014-08-30  
   
1 楼 taoshi 2014-08-29  
感谢分享。

相关推荐

    oracle行转列

    Oracle数据库作为全球广泛使用的数据库管理系统之一,提供了丰富的功能来处理复杂的数据操作。"Oracle行转列"是数据库查询中常见的一种需求,尤其是在数据分析和报表展示时。这个主题涉及到Oracle数据库中的聚合函数...

    Oracle实用教程(第五版)(Oracle11g版)

    在《Oracle实用教程(第五版)(Oracle11g版)》中,我们可以深入学习Oracle数据库管理系统的基础知识和高级特性。Oracle是全球广泛使用的数据库系统之一,尤其在企业级应用中占据重要地位。本教程结合实际案例,如...

    Oracle常用语句-总结文档汇总

    "Oracle常用语句-总结文档汇总"提供了丰富的资源,涵盖了SQL语句的基础到进阶应用,包括列行转换、SQL性能优化等多个关键知识点。 首先,列行转换是数据处理中常见的需求,Oracle提供了多种方法来实现这一操作。...

    oracle多行合并一行

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

    oracle常用经典sql查询.rar

    Oracle数据库是全球广泛使用的大型关系型数据库管理系统之一,它的SQL查询语言是数据处理和数据分析的核心工具。本压缩包“oracle常用经典sql查询.rar”显然是一份关于如何在Oracle环境中高效运用SQL查询的教程资料...

    ORACLE 列转行 DECODE函数用法

    在Oracle数据库中,DECODE函数是一个非常实用的工具,它允许你在SQL查询中进行条件判断,将特定的值转换为其他值。DECODE函数在处理列转行的问题时,尤其适用于将多列数据合并到一行中,使得数据展示更加简洁明了。...

    oracle常用经典sql查询

    本资源“oracle常用经典sql查询”汇集了Oracle环境中的一些常见且实用的SQL查询语句,帮助用户提高数据库操作效率。以下是对这些经典查询语句的详细解读: 1. **基本查询操作** - `SELECT * FROM table_name;`:这...

    oracle行转列聚合函数WMSYS.WM_CONCAT

    Oracle数据库提供了多种方法来实现这一需求,其中`WMSYS.WM_CONCAT`是一个非常实用且高效的函数,它可以将多个字符串值合并成一个单独的字符串,并在每个值之间插入指定的分隔符。 #### 二、WMSYS.WM_CONCAT函数...

    oracle优化篇及常用函数

    6. **分组和窗口函数**:如`GROUP BY`用于分组,`HAVING`过滤分组后的结果,`OVER()`配合窗口函数如`RANK()`、`DENSE_RANK()`、`ROW_NUMBER()`进行行排序和分组计算。 了解并熟练运用这些函数,可以编写出更高效、...

    Oracle函数及常用sql

    Oracle数据库是全球广泛使用的大型关系型数据库管理系统,其强大的功能和灵活性使得它在企业级应用中占据了重要地位。本篇文章将深入探讨Oracle中的基本函数以及常用SQL查询,以帮助初学者快速入门,并为日常使用...

    oracle常用经典SQL查询

    Oracle数据库系统是世界上最广泛使用的数据库管理系统之一,尤其在企业级应用中占据主导地位。SQL(Structured Query Language)是与数据库交互的语言,对于Oracle数据库的管理、数据查询和分析至关重要。以下是一些...

    oracle常用查询

    5. **分组与排序**:GROUP BY用于按一个或多个列对结果进行分组,HAVING则用于过滤分组后的结果。ORDER BY则对查询结果进行升序或降序排序。 6. **索引优化**:理解索引的工作原理,创建合适的索引能显著提升查询...

    Oracle教程

    Oracle数据库是业界广泛使用的关系型数据库管理系统(RDBMS),其功能强大,能够处理大量并发事务处理,是众多企业级应用首选的数据库平台。本知识点将详细介绍Oracle数据库的基础知识、查询语句、体系结构、数据...

    ORACLE常用语法

    Oracle数据库是全球广泛使用的大型关系型数据库管理系统之一,其丰富的SQL语法和强大的功能深受IT专业人士喜爱。本篇文章将深入探讨Oracle中的常用语法,分为Oracle SQL*PLUS基础、Oracle数据库基础、查询基础以及表...

    Oracle性能优化技巧

    HAVING用于分组后的过滤,而WHERE在分组前过滤。 11. **减少对表的查询**:尽量避免不必要的全表扫描,利用索引、分区和物化视图等技术来加速查询。子查询可以优化为连接查询,或者利用EXISTS子句来减少数据处理。 ...

    oracle常用SQL语句(汇总版).zip

    Oracle数据库是全球广泛使用的大型关系型数据库管理系统之一,尤其在企业级应用中占据重要地位。SQL(Structured Query Language)是用于管理和操作数据库的标准语言,包括数据查询、数据更新、数据插入和数据删除等...

    Oracle-SQL基本查询.ppt

    在实际应用中,通过SELECT语句,我们可以根据需求从数据库中提取所需信息,使用WHERE子句过滤特定条件,GROUP BY子句对数据进行分组,然后用HAVING子句对分组后的数据进行过滤,最后使用ORDER BY子句对结果进行升序...

    实用Oracle SQL&PLSQL PPT

    Oracle SQL和PL/SQL是数据库管理员、开发人员和数据分析师在处理Oracle数据库时最常用的工具。Oracle SQL是一种结构化查询语言,用于检索、更新、插入和删除Oracle数据库中的数据,而PL/SQL(Procedural Language/...

    oracle常用经典语句

    6. 分组查询:GROUP BY语句用于根据一个或多个列对结果进行分组。 ```sql SELECT department_id, COUNT(*) FROM employees GROUP BY department_id; ``` 7. 聚合函数:如COUNT(), SUM(), AVG(), MAX()和MIN()用于...

Global site tag (gtag.js) - Google Analytics