2017-03-17 3 views
1

Ich versuche, den Saldo auf einem Konto nach Monat zusammengefasst, nach Konto und Monat gruppiert. Um zum Beispiel einer Transaktion Tabelle, die wie folgt aussieht:SQL-Abfrage zum Zurückgeben der Summe der Spalte nach Monaten gruppiert, einschließlich aller vorherigen Daten

| date  | account_id | trans_amount | 
| 2012-01-01 |   1 |  -2500 | 
| 2012-01-01 |   2 |  -2500 | 
| 2016-01-01 |   1 |   5000 | 
| 2016-01-01 |   2 |   5000 | 
| 2016-02-01 |   1 |   7500 | 
| 2016-02-01 |   2 |   7500 | 

ich die Abfrage zurückgeben möchte:

| month | year | account_id | balance | 
| 01 | 2012 |   1 | -2500 | 
| 01 | 2012 |   2 | -2500 | 
| 01 | 2016 |   1 | 2500 | 
| 01 | 2016 |   2 | 2500 | 
| 02 | 2016 |   1 | 10000 | 
| 02 | 2016 |   2 | 10000 | 

ich damit begonnen:

SELECT MONTH(date), YEAR(date), account_id, SUM(trans_amount) 
FROM transactions 
GROUP BY account_id, MONTH(date), YEAR(date); 

aber natürlich das gibt die Änderung während des gruppierten Zeitraums, nicht den Saldo einschließlich Transaktionen vor dem Zeitraum.

+0

Woher kommt 'amount_cents'? – LONG

+0

Guter Fang - sollte 'trans_amount' sein. Bearbeitet. – MattH

Antwort

1

Der einfachste Weg wäre eine verschachtelte Abfrage. Etwas wie dieses:

SELECT MONTH(date) as month, YEAR(date) as year, account_id, (select SUM(trans_amount) from transactions t2 where t1.date>=t2.date and t1.account_id = t2.account_id) as balance 
FROM transactions t1 
GROUP BY account_id, MONTH(date), YEAR(date); 

Sie müssen höchstwahrscheinlich die Syntax ein wenig beheben. Ich bin mir auch nicht ganz sicher, wie gut die Daten mit der Gruppierung übereinstimmen werden, so dass Sie möglicherweise ein synthetisches Datum für die innere Auswahl konstruieren müssen.

+0

upvote this, thumbs up – LONG

+0

Hmm - wenn ich das versuche, bekomme ich "Ausdruck # 4 der SELECT-Liste ist nicht in der GROUP BY-Klausel und enthält nichtaggregierte Spalte 'datenbankname.t1.date', die funktional nicht von Spalten in GROUP BY abhängig ist Dies ist nicht kompatibel mit sql_mode = only_full_group_by " – MattH

+0

Sie können versuchen, ein Datum aus dem Monat und Jahr zu erstellen und dieses dann in der inneren Auswahlanweisung zu verwenden. Sie müssen es aber von dort aus erarbeiten. Eine andere Möglichkeit wäre, zunächst die "Gruppe nach" zu entfernen und sie zum ersten Mal zu verwenden, ohne dass sich dann die Komplexität nach und nach erhöht –

Verwandte Themen