Schrittweise aufaddieren

FGSimonis

Neuer Benutzer
Beiträge
1
Hallo zusammen,

für eine Mitgliederverwaltung will ich den Kontostand in Form eines Auszugs aus einer Datenbank abfragen.

NR | Buchungsdatum | Betrag | Kontostand
1 | 01.01.17| -15|-15
1 | 02.01.17|+23|+8
1 | 01.02.17|-06|+2
1 | 28.02.17|+11|+13

SELECT NR, Buchungsdatum, Betrag, SUM(????) as Kontostand FROM Buchung WHERE NR=1

Das aufaddieren bekomme ich nicht hin.

Kann mir jemand weiterhelfen?

Vielen Dank
 
Werbung:
Natürlich, ganz einfach:

Code:
test=*# create table buchung(id int, betrag int);
CREATE TABLE
test=*# insert into buchung values (1, -15);
INSERT 0 1
test=*# insert into buchung values (2, 23);
INSERT 0 1
test=*# insert into buchung values (3, -6);
INSERT 0 1
test=*# insert into buchung values (4, 11);
INSERT 0 1
test=*# select *, sum(betrag) over (order by id) from buchung;
 id | betrag | sum
----+--------+-----
  1 |  -15 | -15
  2 |  23 |  8
  3 |  -6 |  2
  4 |  11 |  13
(4 Zeilen)

test=*#

Doch bevor Du das in MySQL versuchst: das kann das nicht. Das sind Window-Funktionen (damit geht noch sehr viel mehr, das hier ist nur ein sehr trivialer Anwendungsfall) und gehört zu den ca. 100.000 Features, die MySQL nicht kann. Du wirst es entweder in der Applikation machen müssen oder eine richtige DB wie z.B. PostgreSQL nutzen.
 
Geht es vielleicht mit einem Subselect in MySQL?
Code:
create table buchung(id int, betrag int);
insert into buchung values (1, -15);
insert into buchung values (2, 23);
insert into buchung values (3, -6);
insert into buchung values (4, 11);

SELECT   id,
     betrag,
     (   SELECT   sum(b.betrag)
       FROM   buchung b
       WHERE   b.id <= buchung.id ) AS saldo
FROM   buchung
ORDER BY id
 
Mag gehen, ist aber grottig, wenn die Tabelle größer wird:

Code:
test=*# explain analyse SELECT  id,
  betrag,
  (  SELECT  sum(b.betrag)
  FROM  buchung b
  WHERE  b.id <= buchung.id ) AS saldo
FROM  buchung
ORDER BY id;
  QUERY PLAN   
--------------------------------------------------------------------------------------------------------------------------
 Sort  (cost=90880.56..90886.21 rows=2260 width=8) (actual time=0.048..0.049 rows=4 loops=1)
  Sort Key: buchung.id
  Sort Method: quicksort  Memory: 25kB
  ->  Seq Scan on buchung  (cost=0.00..90754.65 rows=2260 width=8) (actual time=0.020..0.036 rows=4 loops=1)
  SubPlan 1
  ->  Aggregate  (cost=40.13..40.14 rows=1 width=4) (actual time=0.005..0.005 rows=1 loops=4)
  ->  Seq Scan on buchung b  (cost=0.00..38.25 rows=753 width=4) (actual time=0.003..0.004 rows=2 loops=4)
  Filter: (id <= buchung.id)
  Rows Removed by Filter: 2
 Planning time: 0.063 ms
 Execution time: 0.075 ms
(11 Zeilen)

Man beachte loops=4 bei 4 Zeilen in der Tabelle.
 
Werbung:
Geht auch so:
Code:
SELECT b.*,@betrag:=@betrag +b.betrag as s
FROM buchung b
CROSS JOIN (SELECT @betrag :=0) AS init
ORDER BY id;

Sample

Code:
mysql> SELECT b.*,@betrag:=@betrag +b.betrag AS s
    -> FROM buchung b
    -> CROSS JOIN (SELECT @betrag :=0) AS init
    -> ORDER BY id;
+------+--------+------+
| id   | betrag | s    |
+------+--------+------+
|    1 |    -15 |  -15 |
|    2 |     23 |    8 |
|    3 |     -6 |    2 |
|    4 |     11 |   13 |
+------+--------+------+
4 rows in set (0,00 sec)

mysql>
 
Zurück
Oben