Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 查询以显示每个人在所有较低层级的所有收入之和_Sql_Oracle_Hierarchical Data - Fatal编程技术网

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子句谓词都将被计算

如果未指定“从Oracle开始”,则从每行开始。因此,对于每一行,您可以找到其下属的收入

以下是不带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(当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开始,就有一个层次结构:您知道吗?