C'è qualcosa che non mi quadra nel tuo esempio. L'ultima differenza cumulata dovrebbe essere 40 anzichè 37 se ho capito la logica.
Prova con questa query
codice:
select r.*,r.esistenza-p.somma as cumulata from TABELLA as r
inner join (
select t1.id, nz(sum(t2.quantita),0) AS somma
from TABELLA as t1 left join TABELLA as T2 on (T2.articolo = T1.articolo) and (T2.id <T1.id)
group by t1.articolo, t1.quantita, t1.esistenza, t1.id
order by t1.articolo, t1.id) as p
on r.id = p.id
order by r.articolo,r.id