Jag tror att detta kommer att ge dig vad du vill med hur ett rullande datumintervall du än är intresserad av... Jag har testat genom att skapa min egen "faktura"-tabell med de två kolumnerna identifierade. Det var faktiskt ganska enkelt med användningen av @mySQL-variabler som kan användas inline i frågan... Det enda är att det nu finns ett riktigt sätt att veta vad ett "öppningssaldo" är, så jag har ställt in den initiala startvärdet noll och justera sedan från det.
Kickern är "PreAgg"-frågan för att bara aggregera efter själva datumet för in/ut. Sedan, genom att ordna resultatet i datumordning, startar @ sql-variabeln.
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
Men även om jag har gett ett 3 månaders fönster (-2 månader, +1 månad), tycker jag inte att det är riktigt vettigt eftersom de framtida inläggen inte kommer att ha hänt än... vad som kan vara viktigare är att bara ha
where
i.postdate > date_sub( now(), interval 3 month )
som kommer att få de senaste 3 månaderna från aktuellt datum/tid.