Смысл процедуры - есть дерево "родитель-потомок", причём родителями являются только записи с `type`=0.
Найти сумму поля "summa" по всем веткам дерева, начинающимся с заданного prod_id.
Так?
declare lcount unsigned;
declare curlevel unsigned;
create temporary table tmp_amts (level int, amt Decimal(20,10)); /*суммы по уровню*/
create temporary table tmp_levels (level int,id int); /*идшники по уровням*/
set curlevel:=0;
repeat
if curlevel=0 /*на 0 уровне попроще, тут "парентид" только один, заданный*/
begin;
insert into tmp_amts select curlevel,sum(summa)
from table where prod_id=prod and type=0;
insert into tmp_levels select 0,outlay_id
from table where prod_id=prod and type<>0;
end;
else /*а глубже - берём идшники с предыдущего этапа*/
begin;
insert into tmp_amts select curlevel,sum(summa)
from table join tmp_levels tl on table.id_prod=tl.id where type=0;
insert into tmp_levels select curlevel,outlay_id
from table join tmp_levels tl on table.id_prod=tl.id where type<>0 and tl.level=curlevel-1;
end;
end if;
select count(*) into lcount from tmp_levels where level=curlevel;
-- смотрим, есть ли что-то на следующем уровне
set curlevel=curlevel+1;
until lcount=0 or curlevel>=500;
-- если потомков больше нет, то выходим
-- на всякий случай добавил ограничение на 500 уровней, ибо пишу "на глаз"
-- теперь в таблице tmp_amts получается список "уровень, сумма_по_уровню"
-- дальше с этим списком делайте что хотите
-- как прикрутить какие-то нелинейные/зависящие от уровня/суммы коэффициенты, думаю, догадаетесь уже сами