sql - oracle中列的层次总和

标签 sql oracle hierarchical-data recursive-query

我有一个问题如下:

ID NAME  AMOUNT PARENTID  
1  Adam  1000   0  
2  John  2000   1  
3  Clark 1500   2  
4  Rita  1200   3  
5  jack  1600   3  
6  mark  1800   2  
7  Finn  1500   6  
8  Ryan  1100   6

所以上面的数据是多连接查询的结果 它是一种类似这样的层次结构或树:

       1  
       |  
       2  
     /  \   
   3      6  
  / \     / \  
5   4    7   8 

现在我需要修改我的查询,以便得到以下结果

ID NAME  AMOUNT PARENTID  DownstreamSum   
1  Adam  1000   0         10700     
2  John  2000   1         8700      
3  Clark 1500   2         2800      
4  Rita  1200   3         0         
5  jack  1600   3         0         
6  mark  1800   2         2600      
7  Finn  1500   6         0          
8  Ryan  1100   6         0         

所以逻辑是父节点应该在DownstreamSum列中有所有下游子节点的总和。

例如:

  • id 6 应该是 id 7 和 8 的总和
  • id 3 应该是 id 4 和 5 的总和

但 id 2 应该是 id 3 的数量和 id 4 和 5 的数量之和

我用 partition bygroup by 尝试了许多可能性,但我无法获得所需的输出。

最佳答案

这是查询,请检查。

SQL fiddle link

SELECT  Y.*, X.TOTAL_AMOUNT FROM (
    WITH hierarchy (PARENTID, ID) AS (SELECT PARENTID, ID
        FROM Hierarchy_result
        UNION ALL
        SELECT h.PARENTID, bs.ID
        FROM Hierarchy_result  bs, hierarchy  h WHERE bs.PARENTID=h.ID)
        SELECT h.PARENTID AS PARENTID,
        --SUM(FR.AMOUNT)
        /*SUM((CASE WHEN FR.ID=h.PARENTID
            THEN FR.amount
            ELSE 0.0 END))*/
        SUM(FR.amount) TOTAL_AMOUNT
    FROM hierarchy h, Hierarchy_result FR WHERE FR.ID=h.ID
    GROUP BY h.PARENTID 
    ORDER BY h.PARENTID) X, Hierarchy_result Y WHERE X.PARENTID(+) = Y.ID ORDER BY Y.ID;

关于sql - oracle中列的层次总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63103369/

相关文章:

c# - 用LINQ查询基本问题

java - 甲骨文异常: invalid table name

php - 如何从数据库的平面数组中创建嵌套注释数组

sql - 在 Oracle PLSQL 中的静态时间设置日期 = 明天?

sql - 将 SQL 表转换为以列为父节点的 XML

mysql - 从表格中选择 A 列或 B 列中的值

oracle - 在 Oracle PL/SQL 中使用 ONLINE 将非分区表转换为分区表

sql - 是否有相当于 MySQL 的 show table 命令的 Oracle?

javascript - 将平面数组转换为分层数组

MySQL层次结构数据抽取