Summe nach Gruppierung über mehrere Tabellen

sebix

Neuer Benutzer
Beiträge
2
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
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.028
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.

Was mache ich falsch?

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.
 

akretschmer

Datenbank-Guru
Beiträge
9.028
Was mache ich falsch?

Vielen Dank für eure Hilfe,

Sebix


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)
 
Werbung:
Oben