Penso che questo ti otterrà ciò che desideri con un intervallo di date mobile di cui sei interessato ... Ho testato creando la mia tabella "fattura" con le due colonne identificate. In realtà è stato abbastanza semplice con l'utilizzo di variabili @ mySQL che possono essere utilizzate in linea nella query ... L'unica cosa è che ora esiste un vero modo per sapere cos'è un saldo "di apertura", quindi ho impostato l'iniziale valore di avvio pari a zero, quindi regola da quello.
Il kicker è la query "PreAgg" per aggregare semplicemente in base alla data stessa di entrata/uscita. Quindi, ordinando il risultato in ordine di data, entra in gioco la variabile @ sql.
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
Tuttavia, anche se ho concesso una finestra di 3 mesi (-2 mesi, +1 mese), non credo che abbia davvero senso in quanto i futuri post non saranno ancora avvenuti... ciò che potrebbe essere più importante è basta avere
where
i.postdate > date_sub( now(), interval 3 month )
che otterrà gli ultimi 3 mesi dalla data/ora corrente.