Je pense que cela vous donnera ce que vous voulez, quelle que soit la plage de dates qui vous intéresse... J'ai testé en créant ma propre table "facture" avec les deux colonnes identifiées. C'était en fait assez simple avec l'utilisation de variables @ mySQL qui peuvent être utilisées en ligne dans la requête ... La seule chose est qu'il existe maintenant un véritable moyen de savoir ce qu'est un solde "d'ouverture", j'ai donc défini le initial valeur de démarrage de zéro, puis ajustez à partir de cela.
Le kicker est la requête "PreAgg" pour simplement agréger par la date elle-même d'entrée/sortie. Ensuite, en ordonnant ce résultat par ordre de date, la variable @ sql entre en jeu.
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
Cependant, même si j'ai donné une fenêtre de 3 mois (-2 mois, +1 mois), je ne pense pas que cela ait vraiment de sens car les futures affectations n'auront pas encore eu lieu... ce qui peut être plus important est de avoir juste
where
i.postdate > date_sub( now(), interval 3 month )
qui obtiendra les 3 derniers mois à partir de la date/heure actuelle.