我有一個Oracle數據庫,其中包含表People和Earnings。每個人都有一個領導,許多人可以擁有同一個領導。領導者也可以擁有自己的領導者。所以有一個層次結構。下面是與我現在已經
http://sqlfiddle.com/#!4/15e85/3查詢顯示每個人的所有層次結構中所有收入的總和
我需要創建一個查詢,將統計所有下屬(對所有下級層級的)每個人的收入的總和查詢的例子。所以主要領導者的總和將是除收入之外的所有收入的總和。如何實現這一目標?
我有一個Oracle數據庫,其中包含表People和Earnings。每個人都有一個領導,許多人可以擁有同一個領導。領導者也可以擁有自己的領導者。所以有一個層次結構。下面是與我現在已經
http://sqlfiddle.com/#!4/15e85/3查詢顯示每個人的所有層次結構中所有收入的總和
我需要創建一個查詢,將統計所有下屬(對所有下級層級的)每個人的收入的總和查詢的例子。所以主要領導者的總和將是除收入之外的所有收入的總和。如何實現這一目標?
SELECT p.root, sum(e.EARNINGVALUE) s
FROM Earnings e JOIN
(SELECT p.IdPerson,
connect_by_root p.IdPerson root,
connect_by_isleaf lf
FROM People p
CONNECT BY PRIOR p.IdPerson= p.IdLeader
) p on p.IdPerson = e.IdPerson
where root != p.IdPerson
-- uncomment this if you want to calculate earnings of people who don't have subordinates
-- or lf = 1
GROUP BY root;
的CONNECT_BY_ISLEAF虛列返回1,如果當前行是由CONNECT BY條件定義的樹的葉 。否則它 返回0.此信息指示給定的行是否可以進一步展開以顯示更多的層次結構。
CONNECT_BY_ROOT是一個一元運算符,僅在分層查詢中有效。當您使用此運算符限定列時,Oracle使用來自根行的數據返回列值。這個 運算符擴展了分層查詢的CONNECT BY [PRIOR]條件 的功能。
甲加入,如果存在的話,首先,進行評價,無論是在FROM子句或WHERE子句謂詞被指定的連接:
甲骨文如下處理層次查詢。
的CONNECT BY條件進行評價。
任何剩餘的WHERE子句謂詞進行求值。
如果不指定與甲骨文啓動開始,每行。所以每行都可以找到下屬的收入。
這裏是不CONNECT_BY_ROOT版本:
with tmp_tree as (
SELECT p.IdPerson, rownum rw, level lvl
FROM People p
CONNECT BY PRIOR p.IdPerson = p.IdLeader
),
tmp_tree_with_root as (
SELECT t1.IdPerson, t2.IdPerson root
FROM (SELECT IdPerson, min(rw) over(partition by root_group) root_rw
FROM (SELECT IdPerson, rw,
rw - sum(case when lvl > 1 then 1 else 0 end)
over(order by rw) root_group
FROM tmp_tree)
) t1
join tmp_tree t2
on t1.root_rw = t2.rw
)
SELECT p.root, sum(e.EARNINGVALUE) s
FROM Earnings e JOIN tmp_tree_with_root p
on p.IdPerson = e.IdPerson
where root != p.IdPerson
GROUP BY root;
1)使用ROWNUM標記每個行中的層次結構
2)使用解析rw - sum(case when lvl > 1 then 1 else 0 end) over(order by rw)
定義組(每組是一個層次)
3)tmp_tree_with_root
給出與子查詢相同的結果CONNECT_BY_ROOT
我測試了查詢。這是計算過大的總和。例如,對於ID爲2的人,總和應該是5106(你可以在sqlfiddle中看到)。返回的結果是21312. –
@ user2838197好吧,我知道問題是什麼。等一下(我用你的查詢作爲基地) – Multisync
@ user2838197我已經更新了答案。由於與人有多對一的關係,我必須加入CONNECT BY之後 – Multisync