Sql 查询以显示每个人在所有较低层级的所有收入之和
Sql 查询以显示每个人在所有较低层级的所有收入之和,sql,oracle,hierarchical-data,Sql,Oracle,Hierarchical Data,我有一个Oracle数据库,其中包含表、人员和收入。每个人都有一个领导者,很多人可能有同一个领导者。领导者也可以有自己的领导者。所以有一个等级制度。下面是我现在查询的示例 我需要创建一个查询,计算每个人的所有下属(在所有较低层次上)的收入总和。因此,主要领导人的总收入将是除其收入以外的所有收入的总和。如何做到这一点 SELECT p.root, sum(e.EARNINGVALUE) s FROM Earnings e JOIN (SELECT p.IdPerson, con
我有一个Oracle数据库,其中包含表、人员和收入。每个人都有一个领导者,很多人可能有同一个领导者。领导者也可以有自己的领导者。所以有一个等级制度。下面是我现在查询的示例
我需要创建一个查询,计算每个人的所有下属(在所有较低层次上)的收入总和。因此,主要领导人的总收入将是除其收入以外的所有收入的总和。如何做到这一点
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\u BY\u ISLEAF伪列返回1
由CONNECT by条件定义的树的叶。否则它
返回0。此信息指示是否可以删除给定行
进一步扩展以显示更多层次结构
CONNECT\u BY\u ROOT是一个一元运算符,仅在分层查询中有效。使用此运算符限定列时,
Oracle使用根行中的数据返回列值。这
操作员根据[先前]条件扩展连接的功能
分层查询的定义
Oracle按如下方式处理分层查询:
- 首先计算联接(如果存在),无论该联接是在FROM子句中指定的,还是使用WHERE子句谓词指定的
- 将评估“连接方式”条件
- 任何剩余的WHERE子句谓词都将被计算
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(当lvl>1时,则1,否则0结束)覆盖(按rw排序)
来定义组(每个组都是一个层次结构)3)
tmp_tree_with_root
给出了与CONNECT_BY_root子查询相同的结果,我测试了查询。它计算的金额太大了。例如,对于id为2的人,总和应为5106(您可以在sqlfiddle中看到)。返回的结果是21312。@user2838197好的,我知道问题出在哪里了。等一下(我以你的查询为基础)@user2838197我已经更新了答案。我必须加入后,通过连接,因为有多对一的关系与人它是完美的工作,非常感谢!我还有一个问题。不使用CONNECT\ U BY\ U ISLEAF和CONNECT\ U BY\ U ROOT可以完成此查询吗?我想要一些我以前知道的东西。这对我来说是全新的。@user2838197不,我想不出其他任何东西。我不知道你知道什么。例如,从Oracle 11开始,就有一个层次结构:您知道吗?