Ik denk dat dit je zal geven wat je wilt, maar met een voortschrijdend datumbereik waar je je zorgen over maakt... Ik heb het getest door mijn eigen "factuur"-tabel te maken met de twee geïdentificeerde kolommen. Het was eigenlijk vrij eenvoudig met het gebruik van @ mySQL-variabelen die inline in de query kunnen worden gebruikt ... Het enige is dat er nu een echte manier is om te weten wat een "openings" -saldo is, dus ik heb de initiële opstartwaarde van nul en pas daar vanaf.
De kicker is de "PreAgg"-query om gewoon te aggregeren op de datum zelf van in / uit. Door dat resultaat vervolgens in datumvolgorde te bestellen, wordt de variabele @ sql geactiveerd.
select
PreAgg.PostDate,
@PrevBal as BegBal,
PreAgg.OutFlows,
PreAgg.InFlows,
@PrevBal := @PrevBal + PreAgg.OutFlows + PreAgg.InFlows as EndBal
from
( select
i.postdate,
sum( if( i.amount < 0, i.amount, 0 ) ) as OutFlows,
sum( if( i.amount > 0, i.amount, 0 ) ) as InFlows
from
invoice i
where
i.postdate between date_sub( now(), interval 2 month )
and date_add( now(), interval 1 month )
group by
i.postdate
order by
i.postdate ) as PreAgg,
( select @PrevBal := 0.00 ) as SqlVars
Hoewel ik een venster van 3 maanden heb gegeven (-2 maanden, +1 maand), denk ik niet dat dat echt logisch is, aangezien de toekomstige berichten nog niet hebben plaatsgevonden... wat misschien nog belangrijker is, is om heb gewoon
where
i.postdate > date_sub( now(), interval 3 month )
die de laatste 3 maanden krijgen vanaf de huidige datum/tijd.