Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Schrittweise aufaddieren

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von FGSimonis, 9 März 2017.

  1. FGSimonis

    FGSimonis Neuer Benutzer

    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
     
  2. akretschmer

    akretschmer Datenbank-Guru

    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.
     
  3. ukulele

    ukulele Datenbank-Guru

    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
     
  4. akretschmer

    akretschmer Datenbank-Guru

    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.
     
  5. ukulele

    ukulele Datenbank-Guru

    Das MySQL weh tut bestreite ich nicht, die Erfahrung muss jeder selber machen :)
     
  6. BerndB

    BerndB Datenbank-Guru

    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>
     
    ukulele und akretschmer gefällt das.
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden