17,377
社区成员
发帖
与我相关
我的任务
分享
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
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