以关系形式对树实现进行聚合查询(sql 表)

问题描述 投票:0回答:1

给定 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;
sql postgresql
1个回答
0
投票

参见示例

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
© www.soinside.com 2019 - 2024. All rights reserved.