Oracle实用功能之分组后列合并(树结构)
2014-10-16 21:16
232 查看
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 BY和START 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
相关文章推荐
- Oracle 中实现查找树形结构节点功能
- Oracle按时间分组统计的sql与oracle 多行合并一行
- MYSQL-实现分组排序 对比 ORACLE 和SQLserver用 row_number() over(partition by ) 分组排序功能
- ORACLE SGA的结构、功能和一般设置
- MySQL中实现Oracle里面 rank()over ( PARTITION BY ORDER BY) 分类分组功能
- MySQL使用递归存储过程实现树状结构,实现Oracle的Connect By 功能
- MySQL中实现Oracle里面 rank()over ( PARTITION BY ORDER BY) 分类分组功能
- oracle中分组后,把一组中一列的多行值合并成一行
- oracle 分组合并行
- oracle 基础SQL语句 多表查询 子查询 分页查询 合并查询 分组查询 group by having order by
- MYSQL-实现ORACLE- row_number() over(partition by ) 分组排序功能
- java 实现类似于oracle分组统计的功能
- 一个JAVASCRIPT实用函数,完成合并表格中列中具有相同内容的列单元格的功能
- MYSQL-实现ORACLE 和SQLserver数据中- row_number() over(partition by ) 分组排序功能
- oracle分组后合并其中一个字段
- MYSQL-实现ORACLE- row_number() over(partition by ) 分组排序功能
- MySQL使用递归存储过程实现树状结构,实现Oracle的Connect By 功能在Mysql中如何实现Oracle中的递归
- oracle,分组后,字符串以“,”合并
- oracle合并两张结构相同的表
- mariadb 实用功能3 修改表结构显示进度