给定 SQL 表中的以下树结构,并假设数据一致(不存在同名但父级不同的行):
| name | parent | value |
|------|--------|-------|
| a | null | 10 |
| b | a | 15 |
| b | a | 4 |
| c | a | 15 |
| d | a | 10 |
| e | b | 5 |
| f | b | 5 |
| g | null | 20 |
我正在寻找一个查询来总结给定节点的所有子类别,如下所示:
| name | parent | value |
|------|--------|-------|
| a | null | 64 |
| b | a | 29 |
| c | a | 15 |
| d | a | 10 |
| e | b | 5 |
| f | b | 5 |
| g | null | 20 |
所以,我只能进行第一级求和,我可以考虑将其加入父表本身,然后再次求和......但我正在寻找未指定深度的树的解决方案。例如,对于 1 级,我有:
SELECT
NAME,
PARENT,
SUM(VALUE) AS VALUE
FROM
TEST
GROUP BY
NAME,
PARENT
ORDER BY
NAME ASC;
参见示例
with recursive
gr as(select name,parent,sum(amount) amount
from test14 group by name,parent)
,r as(
select 1 lvl,name root,parent,name child,0::bigint total,amount
from gr
union all
select lvl+1 lvl,r.root,r.parent,t.name child,r.total+t.amount,t.amount
from r inner join gr t on t.parent=r.child
)
select root,parent,sum(amount)
from r
group by root,parent
order by root
名字 | 家长 | 总计 |
---|---|---|
a | 空 | 64 |
b | a | 29 |
c | a | 15 |
d | a | 10 |
e | b | 5 |
f | b | 5 |
g | 空 | 20 |