Ich denke, das wird Ihnen das bringen, was Sie wollen, mit einem rollierenden Datumsbereich, mit dem Sie sich befassen ... Ich habe getestet, indem ich meine eigene "Rechnungs" -Tabelle mit den beiden identifizierten Spalten erstellt habe. Mit der Verwendung von @ mySQL-Variablen, die inline in der Abfrage verwendet werden können, war es eigentlich ganz einfach ... Das einzige ist, dass es jetzt einen wahren Weg gibt, um zu wissen, was ein "Eröffnungssaldo" ist, also habe ich den Anfangswert gesetzt Startwert von Null, dann davon abgleichen.
Der Kicker ist die "PreAgg"-Abfrage, um nur nach dem Datum selbst von In/Out zu aggregieren. Dann, indem Sie dieses Ergebnis in Datumsreihenfolge anordnen, tritt die @ SQL-Variable in Kraft.
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
Obwohl ich ein 3-Monats-Fenster angegeben habe (-2 Monate, +1 Monat), denke ich nicht, dass das wirklich Sinn macht, da die zukünftigen Postings noch nicht stattgefunden haben ... was vielleicht wichtiger ist, ist zu habe nur
where
i.postdate > date_sub( now(), interval 3 month )
die die letzten 3 Monate ab dem aktuellen Datum/der aktuellen Uhrzeit erhält.