我有一个问题如下:
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 by
和 group by
尝试了许多可能性,但我无法获得所需的输出。
最佳答案
这是查询,请检查。
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/