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

Summe nach Gruppierung über mehrere Tabellen

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von sebix, 8 November 2013.

  1. sebix

    sebix Neuer Benutzer

    Hallo Zusammen,

    ich suche schon seit Stunden nach der Lösung für ein möglicherweise einfaches Problem.

    Ich möchte eine einfache Abfrage starten, die die Absätze von Mitarbeitern nach Datum ausgibt.

    Um sauber zu arbeiten habe ich drei Tabellen erstellt:

    1. Mitarbeiter (persnr, name)
    2. Produkte (produktnummer, produktname)
    3. auftrag (produktnummer, persnr, anzahl, datum)

    Nun möchte ich die Absätze nach Mitarbeiter und Datum mit Namen ausgeben.

    Das Ergebnis soll also so aussehen:

    Datum....Mitarbeiter.....Produkt
    01.01.12...Hans..............Gemüsereibe

    Ich habe es so versucht:

    SELECT SUM(auftrag.`anzahl`) AS Produktsumme, Mitarbeiter.name, Produkte.produktname, auftrag.datum
    FROM Mitarbeiter, Produkte, auftrag
    Where auftrag.produktnummer = Produkte.produktnummer
    AND Mitarbeiter.persnr = auftrag.persnr
    GROUP BY auftrag.datum

    Das funktioniert auch nicht schlecht, ich bekomme aber immer die gleich Anzahl an Produkten für alle Tage.

    Die Ausgabe sieht so aus:

    Produktsumme name produktname datum
    3 .....Hans .....Gemüsereibe .....2013-11-20
    3 .....Hans .....Gemüsereibe .....2030-11-20


    Ich habe aber nur zwei Aufträge erzeugt.

    Was mache ich falsch?

    Vielen Dank für eure Hilfe,

    Sebix
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Falsch macht hier MySQL was: in solchen Abfragen müssen alle Spalten entweder in einer Aggregation oder im GROUP BY sein. Name und Produktname genügen dieser Forderung nicht, das ist ein ganz klarer Verstoß gegen die SQL-Syntax. MySQL ignoriert das und macht irgend etwas, was vielleicht bei Vollmond und Dienstags richtig ist, sonst aber nicht. Alle anderen Datenbanken würden richtig handeln und eine solche Abfage als syntaktisch falsch ablehnen.

    Ich hab grad ned viel Zeit, komme grad von der sehr erfolgreichen http://2013.pgconf.de , vielleicht schaue ich morgen mir Dein Problem genauer an.
     
  3. akretschmer

    akretschmer Datenbank-Guru


    Code:
    test=*# select * from mitarbeiter ;
    persnr | name
    --------+------
          1 | hans
    (1 row)
    
    Time: 0,174 ms
    test=*# select * from produkte;
    produktnummer | produktname
    ---------------+-------------
                1 | gemüsereibe
    (1 row)
    
    Time: 0,174 ms
    test=*# select * from auftrag ;
    produktnummer | persnr | anzahl |  datum
    ---------------+--------+--------+------------
                1 |      1 |      1 | 2013-11-20
                1 |      1 |      1 | 2013-11-20
                1 |      1 |      1 | 2013-11-21
    (3 rows)
    
    Time: 0,171 ms
    test=*# select sum(anzahl), name, produktname, datum from auftrag left join produkte on (auftrag.produktnummer=produkte.produktnummer) left join mitarbeiter on (auftrag.persnr=mitarbeiter.persnr) group by name, produktname, datum;
    sum | name | produktname |  datum
    -----+------+-------------+------------
      2 | hans | gemüsereibe | 2013-11-20
      1 | hans | gemüsereibe | 2013-11-21
    (2 rows)
    
     
    ukulele gefällt das.
  4. sebix

    sebix Neuer Benutzer

    Vielen vielen Dank. Jetzt geht es! :)
     
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