Ключом к решению этой проблемы является рекурсивный CTE для генерации менеджеров.
Однако я считаю этот вопрос сложным. Если вы хотите, чтобы все строго ниже менеджеров второго уровня, то вы можете использовать рекурсивный CTE - генерировать менеджеров и просто выбирать менеджеров второго уровня.
Но вы также хотите добавить вернуться в значения для этих менеджеров. Я думаю, что это требует еще одного дополнительного шага.
Следующее делает то, что вы хотите:
with recursive cte as (
select u.id,'{}'::int[] as mgrs, 1 as lev
from users u
where mgr_id is null
union all
select u.id, (mgrs || array[u.mgr_id]), lev + 1
from cte join
users u
on u.mgr_id = cte.id
)
select cte.mgrs[2], sum(t.cost) + coalesce(tm.cost, 0)
from cte join
t
on t.user_id = cte.id left join
(select t.user_id, sum(cost) as cost
from t
group by t.user_id
) tm
on cte.mgrs[2] = tm.user_id
where cardinality(mgrs) >= 2
group by mgrs[2], tm.cost;
Здесь - это db <> скрипка.