Oracle树形汇总--connect_by_root

有个需求:统计上级部门的销售额,制造数据如下:

drop table dept;

create table dept

(

DEPTNO number,

DEPTNAME varchar2(50),

PARENT_DEPTNO number

);

insert into dept values(1,‘市场部‘,-1);

insert into dept values(2,‘市场一部‘,1);

insert into dept values(3,‘市场二部‘,1);

insert into dept values(4,‘销售一组‘,2);

insert into dept values(5,‘销售二组‘,2);

insert into dept values(6,‘销售三组‘,3);

insert into dept values(7,‘销售四组‘,3);

insert into dept values(8,‘电力1‘,4);

insert into dept values(9,‘电力2‘,5);

insert into dept values(10,‘电力3‘,4);

insert into dept values(11,‘电力4‘,5);

insert into dept values(12,‘石油1‘,6);

insert into dept values(13,‘石油2‘,7);

insert into dept values(14,‘石油3‘,6);

insert into dept values(15,‘石油4‘,7);

commit;

drop table sales;

create table sales

(

id number,

sale_num number,

deptno number

);

insert into sales values(1,50000,8);

insert into sales values(2,10000,9);

insert into sales values(3,60000,10);

insert into sales values(4,10000,11);

insert into sales values(5,20000,12);

insert into sales values(6,40000,13);

insert into sales values(7,90000,14);

insert into sales values(8,110000,15);

commit;

select dd.deptno, dd.deptname, nvl(s.sale_num, 0) sale_num, dd.parent_deptno

from (select d.deptno,

cast(lpad(‘ ‘, level * 2 - 1) || d.deptname as varchar2(50)) deptname,

rownum rn,

d.parent_deptno

from dept d

start with d.PARENT_DEPTNO = -1

connect by prior d.DEPTNO = d.PARENT_DEPTNO) dd,

sales s

where dd.deptno = s.deptno(+)

order by dd.rn;

DEPTNO DEPTNAME                                             SALE_NUM PARENT_DEPTNO

-------- -------------------------------------------------- ---------- -------------

1  市场部                                                     0            -1

2    市场一部                                                 0             1

4      销售一组                                               0             2

8        电力1                                            50000             4

10        电力3                                            60000             4

5      销售二组                                               0             2

9        电力2                                            10000             5

11        电力4                                            10000             5

3    市场二部                                                 0             1

6      销售三组                                               0             3

12        石油1                                            20000             6

14        石油3                                            90000             6

7      销售四组                                               0             3

13        石油2                                            40000             7

15        石油4                                           110000             7

统计所有父部门的营业额。

思路1:先将所有的父部门查出来,然后弄一个子查询做递归查询出其子节点,然后求和,这种思路很简单,效率也低,不推荐。

思路2:先用层次查询查出树形结构,要想统计一个节点下的汇总,需要用到connect_by_root,同一个节点下的connect_by_root是一样的,然后再group by。

--实现如下

with temp as

(select dd.deptno,nvl(s.sale_num, 0) sale_num,root_id,rn

from (select d.deptno,

connect_by_root(d.deptno) root_id,

rownum rn

from dept d

start with d.PARENT_DEPTNO in(select PARENT_DEPTNO from dept)

connect by prior d.DEPTNO = d.PARENT_DEPTNO) dd,

sales s

where dd.deptno = s.deptno

order by dd.rn),

temp1 as(select root_id,sum(sale_num) s_sum from temp group by root_id),

temp3 as( --加上temp3纯粹是为了阅读方便

select d.deptno,

cast(lpad(‘ ‘, level * 2 - 1) || d.deptname as varchar2(50)) deptname,

rownum rn

from dept d

start with d.PARENT_DEPTNO = -1 connect by prior d.DEPTNO = d.PARENT_DEPTNO

)

select t3.deptno,t3.deptname,t1.s_sum from temp1 t1,temp3 t3 where t1.root_id = t3.deptno

order by rn;

DEPTNO DEPTNAME                                                S_SUM

---------- -------------------------------------------------- ----------

1  市场部                                                390000

2    市场一部                                            130000

4      销售一组                                          110000

8        电力1                                            50000

10        电力3                                            60000

5      销售二组                                           20000

9        电力2                                            10000

11        电力4                                            10000

3    市场二部                                            260000

6      销售三组                                          110000

12        石油1                                            20000

14        石油3                                            90000

7      销售四组                                          150000

13        石油2                                            40000

15        石油4                                           110000

已选择15行。

时间: 2024-12-28 08:02:57

Oracle树形汇总--connect_by_root的相关文章

64位 SQL Server2008链接访问Oracle 过程汇总解决方法记录

64位 SQL Server2008链接访问Oracle 过程汇总解决方法记录 经过几天不停的网上找资料,实验,终于联通了. 环境:系统:win 2008 ,SqlServer2008 R2, 连接Oracle10g 在SqlServer2008 R2机器上需要安装Oracle客户端32位和64位两个,然后配置连接别名.设置注册表.详细情况见下面 1.错误1 ------------------------------------------------ 64位机器上建立OLE_DB链接报错 报

Oracle 异常处理汇总

Oracle 异常处理汇总 1.plsql无法连接 安装oracle,中间录入密码,用户是:sys,pass: 录入的密码. 连接数据库,建议创建新的用户,最好别直接用sys 安装完毕,则需要配置Net Configration Assistant,才能通过pl/sql连接 确保服务监听服务已经启动 2.遇到ORACLE错误12514 解决方案: 1) 找到监听文件 C:\Oracle\product\11.2.0\dbhome_1\NETWORK\ADMIN\listener.ora 打开:

javascript树形汇总金额

在开发企业应用的时候总会遇到树形汇总金额的场景,即将树形的列表中的叶子节点(没有子节点)的金额汇总到父节点上. 这种需求一般是在前端进行处理,即使用JavaScript处理,因为叶子节点的金额可能是不断改变的,每回变动都请求后台显然不现实. 场景与实现 假设有一个主从表的场景.第一点,从表是一个树形的列表,只有叶子节点能填写金额,父节点都汇总其下叶子节点的金额.第二点,主表有一个金额字段,取值汇总自汇总从表中所有根节点(顶级父节点)的金额. 先编写一个遍历从表中所有根节点的方法. functio

Oracle异常汇总

持续更新中,可参见https://hnuhell.gitbooks.io/oracle_errmg/content/或https://hnuhell.github.io/Oracle_ERRMG/上的页面. ORA-00000 to ORA-00877 ORA-00000: 正常的成功的完成(操作) ORA-00000: normal, successful completion 原因1: 正常执行完成.[部分验证] Normal exit. 分析: 此异常多数为程序没有执行SQL语句或者说成功

[转载]oracle树形查询 start with connect by

一.简介 在oracle中start with connect by (prior) 用来对树形结构的数据进行查询.其中start with conditon 给出的是数据搜索范围, connect by后面给出了递归查询的条件,prior 关键字表示父数据,prior 条件表示子数据需要满足父数据的什么条件.如下start with id= '10001' connect by prior parent_id= id and prior num = 5表示查询id为10001,并且递归查询pa

Oracle树形表和递归查询

地址:https://blog.csdn.net/hellowordapi/article/details/75763432 在平常的业务系统开发中,我们经常需要设计数据层次关系,如在经典的user-role-permission权限设计中, 需要对权限表的数据设计成一种层次依赖关系,如最顶层的为系统管理,系统管理的下一层为角色 管理,角色管理的下一层又为角色的CRUD操作, 那么这种表就可以抽象成为数据结构里面的B树. 如下表 : CREATE TABLE "U_PERMISSION"

oracle树形结构遍历

数据库树形结构,正反遍历 --从Root往树末梢递归select level ,identity,pid from table_name start with identity=475 connect by prior identity = pid --从末梢往树ROOT递归select level ,identity,pid,yylevel from table_name start with identity=542 connect by prior pid = identity

Oracle 常见问题汇总

1.Listener refused the connection with the following error 安装之后如果遇到如下问题状态: 失败 -测试失败: Listener refused the connection with the following error:ORA-12505, TNS:listener does not currently know of SID given in connect descriptor 解决办法:1.首先使用SQL Plus用管理员账户

oracle 语句汇总

Oracle数据库常用sql语句 ORACLE 常用的SQL语法和数据对象 一.数据控制语句 (DML) 部分 1.INSERT  (往数据表里插入记录的语句) INSERT INTO 表名(字段名1, 字段名2, ……) VALUES ( 值1, 值2, ……); INSERT INTO 表名(字段名1, 字段名2, ……)  SELECT (字段名1, 字段名2, ……) FROM 另外的表名; 字符串类型的字段值必须用单引号括起来, 例如: ’GOOD DAY’ 如果字段值里包含单引号’