Home > Enterprise >  Count children from hierarchy path
Count children from hierarchy path

Time:03-09

I have a table like this:

id name path
1 John /1
2 Mark /2
3 Kevin /1/3
4 Sarah /1/3/4
5 Andy /2/5
... ... ...

So, I can say that Sarah is Kevin's child which is John's child.

I would like to have this:

id name path number of children
1 John /1 2
2 Mark /2 1
3 Kevin /1/3 1
4 Sarah /1/3/4 0
5 Andy /2/5 0
... ... ... ...

TASK NUMBER 2: Let's say that I have this table too

id income user_id
1 200 1
2 120 1
3 340 2
4 500 3
5 600 5
6 80 5

I can say that John has a Total income of 320$, but if I also want to count John's children, it is 820$ (because id =3 is John's child). So, I would also like a query where I can count all the hierarchical incomes.

CodePudding user response:

You can do:

select
  t.*,
  (select count(*) from t c where c.path like t.path || '/%') as c_count,
  i.income   (
    select coalesce(sum(i.income), 0) from t c join i on i.user_id = c.id
     where c.path like t.path || '/%'
  ) as c_income
from t
left join (
  select user_id, sum(income) as income from i group by user_id
) i on i.user_id = t.id

Result:

 id  name   path    c_count  c_income 
 --- ------ ------- -------- -------- 
 1   John   /1      2        820      
 2   Mark   /2      1        1020     
 3   Kevin  /1/3    1        500      
 4   Sarah  /1/3/4  0        null     
 5   Andy   /2/5    0        680      

See example at DB Fiddle.

  • Related