Myślę, że dzięki temu uzyskasz to, czego chcesz, niezależnie od tego, jaki zakres dat Cię interesuje... Przetestowałem, tworząc własną tabelę „faktura” z dwiema zidentyfikowanymi kolumnami. W rzeczywistości było to dość proste z wykorzystaniem zmiennych @mySQL, które mogą być używane w zapytaniu ... Jedyną rzeczą jest to, że istnieje teraz prawdziwy sposób, aby dowiedzieć się, czym jest saldo "otwierające", więc ustawiłem początkowe wartość początkowa zero, a następnie dostosuj ją.
Kicker to zapytanie „PreAgg”, które ma agregować według samej daty wejścia/wyjścia. Następnie, porządkując ten wynik w kolejności dat, uruchamia się zmienna @ 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
Jednak pomimo tego, że dałem 3 miesiące (-2 miesiące, +1 miesiąc), nie sądzę, aby to miało sens, ponieważ przyszłe posty jeszcze się nie wydarzyły... co może być ważniejsze, to po prostu mieć
where
i.postdate > date_sub( now(), interval 3 month )
który otrzyma ostatnie 3 miesiące od bieżącej daty/czasu.