关于SQL递归统计问题

huangjinyin 2010-05-26 04:34:25
oracle库
有表A 父节点ID为0表根节点,注父子节点是无限级的

节点ID 父节点ID 时间S(int)
A    0 60
B    A 40
C    A 20
D    0 40

表B
节点ID  己用时间
B     10
C     5
D     20
求根节点(A与D)所用时间百分比 
结果如
A 60 25%
D 40 50%    
...全文
269 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
小灰狼W 2010-05-29
  • 打赏
  • 举报
回复
select 节点id,时间s,sum(已用时间)/时间s 百分比
from(
select connect_by_root a.节点id 节点id,
connect_by_root a.时间s 时间s,b.已用时间
from 表A a,表B b
where a.节点id=b.节点id(+)
start with a.父节点id='0'
connect by prior a.节点id=a.父节点id)
group by 节点id,时间s
zhangwonderful 2010-05-28
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wh62592855 的回复:]

SQL code
SQL> select * from t1;

CID PID TIME
---------- ---------- ---------------------------------------
A 0 ……
[/Quote]
支持
嘟嘟xo 2010-05-28
  • 打赏
  • 举报
回复
 
SQL> select * from ls_a;

ID PID T
---------- -------------------- -----------
A 0 60
B A 40
C A 20
D 0 40

SQL> select * from ls_b;

ID T
---------- -----------
B 10
C 5
D 20

SQL>
SQL> SELECT R_ID,
2 SUM(TOTAL) TOTAL,
3 SUM(USED) USED,
4 SUM(USED) / SUM(TOTAL) PERCENT
5 FROM (SELECT CONNECT_BY_ROOT LS_A.ID R_ID,
6 LS_A.PID,
7 DECODE(LS_A.PID, '0', LS_A.T, 0) TOTAL,
8 DECODE(LS_A.PID, '0', DECODE(CONNECT_BY_ISLEAF, 1, LS_B.T, 0), LS_B.T) USED
9 FROM LS_A, LS_B
10 WHERE LS_A.ID = LS_B.ID(+)
11 START WITH LS_A.PID = '0'
12 CONNECT BY PRIOR LS_A.ID = LS_A.PID)
13 GROUP BY R_ID;

R_ID TOTAL USED PERCENT
---------- ---------- ---------- ----------
D 40 20 0.5
A 60 15 0.25
wh62592855 2010-05-28
  • 打赏
  • 举报
回复
SQL> select * from t1;

CID PID TIME
---------- ---------- ---------------------------------------
A 0 60
B A 40
C A 20
D 0 40

SQL> select * from t2;

CID PASSED
---------- ---------------------------------------
B 10
C 5
D 20

SQL>
SQL> select root_name,time,percentage
2 from
3 (
4 select root_name,pid,time,sum(passed) over(partition by root_name)/time as percentage
5 from
6 (
7 select a.cid,a.time,a.pid,a.root_name,b.passed
8 from
9 (
10 SELECT CID, PID, TIME, CONNECT_BY_ROOT(CID) ROOT_NAME
11 FROM T1
12 START WITH PID = '0'
13 CONNECT BY PRIOR CID = PID
14 ) a left join t2 b
15 on a.cid = b.cid
16 )
17 )
18 where pid = '0'
19 ;

ROOT_NAME TIME PERCENTAGE
---------- --------------------------------------- ----------
A 60 0.25
D 40 0.5
huangjinyin 2010-05-27
  • 打赏
  • 举报
回复
A的25%是,子节点B+C=60,B+C己花15 所以是25%
ap_jiang 2010-05-26
  • 打赏
  • 举报
回复
A 的25%是怎么出来的 ?
lzbbob1985 2010-05-26
  • 打赏
  • 举报
回复
结果如
A 60 25%
D 40 50%


A 结果很奇怪 迷茫的路过
永生天地 2010-05-26
  • 打赏
  • 举报
回复
参考递归

SELECT *
FROM A
START WITH 父节点ID =0
CONNECT BY 父节点ID  = PRIOR 节点ID;
黄_瓜 2010-05-26
  • 打赏
  • 举报
回复
oracle 建议你到oracle专区问问

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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