oracle逐级向上汇总问题

jishubenchi 2010-12-27 10:34:16
inst_no inst_lvl sup_inst_no dbal cbal
0000 1 0000 null null
0001 2 0000 null null
0002 2 0000 null null
000101 3 0001 200 null
000102 4 000101 200 100
000201 3 0002 100 50
实现的查询结果:
inst_no inst_lvl sup_inst_no dbal cbal
0000 1 0000 300 150
0001 2 0000 200 100
0002 2 0000 100 50
000101 3 0001 200 100
000102 4 000101 200 100
000201 3 0002 100 50

说明:如果一个节点已经存在值,就说明下级机构数据已经汇总到该机构,
就不能重复汇总了,如果没,则要汇总到上级机构!

请各位大侠帮忙啊!

...全文
638 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
minitoy 2010-12-29
  • 打赏
  • 举报
回复
select inst_no,
inst_lvl,
sup_inst_no,
(select sum(nvl(dbal, 0))
from tablet b
where connect_by_isleaf=1
start with b.inst_no = a.inst_no
connect by b.sup_inst_no = prior b.inst_no) dbal,
(select sum(nvl(cbal, 0))
from tablet b
where connect_by_isleaf=1
start with b.inst_no = a.inst_no
connect by b.sup_inst_no = prior b.inst_no) cbal
from tablet a;
minitoy 2010-12-29
  • 打赏
  • 举报
回复
哦,那在计算的时候加上connect_by_isleaf=1限定就可以了.[Quote=引用 3 楼 jishubenchi 的回复:]
l楼的回答虽然不符合我的要求,但还是非常感谢你的回答哦!
我的要求是假如上级机构已经汇总过,就不要重复汇总,如果没汇总过,则汇总上去!
[/Quote]
minitoy 2010-12-28
  • 打赏
  • 举报
回复
SQL> select * from tablet;

INST_NO INST_LVL SUP_INST_NO DBAL CBAL
---------- ---------- ----------- ---------- ----------
0000 1
0001 2 0000
0002 2 0000
000101 3 0001
000102 4 000101 200 100
000201 3 0002 100 50

6 rows selected

SQL>
SQL> select inst_no,
2 inst_lvl,
3 sup_inst_no,
4 (select sum(nvl(dbal, 0))
5 from tablet b
6 start with b.inst_no = a.inst_no
7 connect by b.sup_inst_no = prior b.inst_no) dbal,
8 (select sum(nvl(cbal, 0))
9 from tablet b
10 start with b.inst_no = a.inst_no
11 connect by b.sup_inst_no = prior b.inst_no) cbal
12 from tablet a;

INST_NO INST_LVL SUP_INST_NO DBAL CBAL
---------- ---------- ----------- ---------- ----------
0000 1 300 150
0001 2 0000 200 100
0002 2 0000 100 50
000101 3 0001 200 100
000102 4 000101 200 100
000201 3 0002 100 50

6 rows selected

SQL>
gelyon 2010-12-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jishubenchi 的回复:]
l楼的回答虽然不符合我的要求,但还是非常感谢你的回答哦!
我的要求是假如上级机构已经汇总过,就不要重复汇总,如果没汇总过,则汇总上去!
[/Quote]

--这个不就是你的结果吗?
select inst_no,
inst_lvl,
sup_inst_no,
(select sum(nvl(cbal, 0))
from tablet b
start with b.inst_no = a.inst_no
connect by b.sup_inst_no = prior b.inst_no) cbal
from tablet a;
jishubenchi 2010-12-28
  • 打赏
  • 举报
回复
l楼的回答虽然不符合我的要求,但还是非常感谢你的回答哦!
我的要求是假如上级机构已经汇总过,就不要重复汇总,如果没汇总过,则汇总上去!
tangren 2010-12-28
  • 打赏
  • 举报
回复
多练练手,了解一些oracle常用函数

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧