2015-03-30 86 views
1

連接被作爲一個例子,我有查詢與CONNECT BY語句:甲骨文聚集

SELECT employee_id, last_name, manager_id, sales, LEVEL 
    FROM employees 
    CONNECT BY PRIOR employee_id = manager_id; 

,該查詢產生以下結果:

EMPLOYEE_ID LAST_NAME     MANAGER_ID SALES  LEVEL 
----------- ------------------------- ---------- -------- ---------- 
     101 Kochhar       100  121   1 
     108 Greenberg      101  80   2 
     109 Faviet       108  54   3 
     110 Chen        108  23   3 

我正在尋找一種方式來計算的份額(80 +/121 + 80),(54 + 23)/(54 + 23 + 80)。

回答

1

該查詢所需提供了價值,但我不知道如果我沒有過於複雜的事情:

select employee_id, last_name, manager_id, sales, suma, prior suma psuma, 
    cast(suma/(prior suma + suma) as number(8, 4)) sumb 
    from (
    with t as (SELECT employee_id, last_name, manager_id, sales, LEVEL lvl 
     FROM employees 
     where employee_id in (101, 108, 109, 110) 
     CONNECT BY PRIOR employee_id = manager_id 
     start with employee_id = 101) 
    select employee_id, last_name, manager_id, sales, lvl, 
     sum(sales) over (partition by manager_id) suma from t) t 
    connect by prior employee_id = manager_id 
    start with employee_id=101 
    order siblings by employee_id 

結果:

EMPLOYEE_ID LAST_NAME  MANAGER_ID  SALES  SUMA  PSUMA  SUMB 
----------- -------------- ---------- ---------- ---------- ---------- ---------- 
     101 Kochhar    100  121  121      
     108 Greenberg    101   80   80  121  ,398 
     109 Faviet    108   54   77   80  ,4904 
     110 Chen     108   23   77   80  ,4904 

編輯: 同查詢如上,但更可讀,步驟更明顯,我希望。

T1基本上是您的查詢,只是從HR schema過濾了有趣的行。

T2是查詢與相同的經理(這一組Faviet和陳)集合總和。

最後的查詢又是分層次的,但是尋求所有已經合計的總和。

with t1 as (
    SELECT employee_id, last_name, manager_id, sales, LEVEL lvl 
    FROM employees where employee_id in (101, 108, 109, 110) 
    CONNECT BY PRIOR employee_id = manager_id 
    start with employee_id = 101), 
t2 as (select employee_id, last_name, manager_id, sales, lvl, 
    sum(sales) over (partition by manager_id) suma from t1) 
select employee_id, last_name, manager_id, sales, suma dividend, 
    prior suma + suma divider, 
    cast(suma/(prior suma + suma) as number(8, 4)) result 
    from t2 connect by prior employee_id = manager_id 
    start with employee_id=101 
    order siblings by employee_id 


EMPLOYEE_ID LAST_NAME  MANAGER_ID  SALES DIVIDEND DIVIDER  RESULT 
----------- ---------------- ---------- ---------- ---------- ---------- ---------- 
     101 Kochhar     100  121  121      
     108 Greenberg    101   80   80  201  ,398 
     109 Faviet     108   54   77  157  ,4904 
     110 Chen     108   23   77  157  ,4904