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.