Wieder ein SQL Problem mit HAVING/WHERE
Andreas
- datenbank
0 Daniela Koller0 andreas0 Klaus Mock0 Andreas
Hallo!
Nochmal eine SQL-Frage: Ich habe folgende Abfrage:
SELECT SUM(Anzahl),bestellt
FROM p_bestelldaten
GROUP BY PID
HAVING bestellt = 0
Damit würde ich gerne für jedes Produkt(PID) die Anzahl ausgeben, die noch nicht bestellt ist. In einer einfachen Select - Abfrage, nur mit Where konnte ich schreiben, where bestellt = 0
Damit wurde alle Datensätze gefiltert, die noch keinen Wert im Datetime Feld "bestellt" hatten.
Die obige Abfrage schert sich aber einen Dreck darum, ob im Feld "bestellt" ein Datum steht oder nicht. Und wenn ich statt HAVING WHERE einsetze geht gar nichts mehr.
Jemand ne Idee?
Grüße
Andreas
Hi Andreas
SELECT SUM(Anzahl),bestellt
FROM p_bestelldaten
GROUP BY PID
HAVING bestellt = 0
So geht das nicht, ich habs schon beim letzten Posting erklärt wieso.
Group By bezieht sich auf die Felder die du beim Select angibst,
und da steht keine PID, wenn du danach gruppieren willst, dann gib
sie auch oben an. Was nützt es dir nach etwas zu gruppieren wenn du gar
nicht weist, zu welcher Gruppe die Ausgabezeile gehört?
Eine strengeres Datenbankmanagementsystem hätte dir die Query oben
um die Ohren geschmissen, welches bestellt soll ausgegeben werden?
Das vom ersten Teilbetrag der Summe, oder das vom hundertsten? Es
macht einfach keinen Sinn da bestellt anzugeben ausser du gruppierst
darüber und ziehst die Summe damit nur über die Datenzeilen, die
jeweils bestellt identisch haben.
Damit wurde alle Datensätze gefiltert, die noch keinen Wert im Datetime Feld "bestellt" hatten.
Dann mach das doch im where wenn du sie nicht in der Summe haben willst?
Having nimmt dir ganze Zeilen aus der Resultattabelle raus, also wenn
das, bei MySQL ziemlich zufällig (wohl physisch erste), hinzugefügte
bestellt = 0 ist, dann wird deine Summe nicht angezeigt, das ist wohl
nicht ganz das was du willst. Wenn du willst das die Zeile nicht in die
Summe kommt, dann filtere es im where hinaus, dass das Probleme gibt,
liegt wohl eher an der immernoch fehlerhaften Query.
Was du suchst dürfte wohl das sein:
SELECT PID, SUM(Anzahl)
FROM p_bestelldaten
WHERE bestellt = 0
GROUP BY PID
Gruss Daniela
Hi!
Group By bezieht sich auf die Felder die du beim Select angibst,
und da steht keine PID, wenn du danach gruppieren willst, dann gib
sie auch oben an. Was nützt es dir nach etwas zu gruppieren wenn du gar
nicht weist, zu welcher Gruppe die Ausgabezeile gehört?
Nun ja, darüber hatte sich mysql nicht beschwert, und da ich von Natur aus faul bin....
SELECT PID, SUM(Anzahl)
FROM p_bestelldaten
WHERE bestellt = 0
GROUP BY PID
Ah, ich dachte where kommt danach! Dumm von mir! Vielen Dank!
Grüße
Andreas
Hallo,
Nun ja, darüber hatte sich mysql nicht beschwert, und da ich von Natur aus faul bin....
Nun ja, Faulheit kann durchaus etwas Gutes sein, aber vermeide es, schlampig zu werden;-)
SELECT PID, SUM(Anzahl)
FROM p_bestelldaten
WHERE bestellt = 0
GROUP BY PID
Ah, ich dachte where kommt danach! Dumm von mir! Vielen Dank!
Merke:
WHERE kommt vor GROUP BY und bezieht sich auf die Tabellenfelder.
HAVING kommt nach GROUP BY und bezieht sich auf die Ergebnisfelder.
Grüße
Klaus
Hi!
Nun ja, Faulheit kann durchaus etwas Gutes sein, aber vermeide es, schlampig zu werden;-)
Das das schlampig sein könnte habe ich überhaupt nicht im entferntesten dran gedacht!
Merke:
WHERE kommt vor GROUP BY und bezieht sich auf die Tabellenfelder.
HAVING kommt nach GROUP BY und bezieht sich auf die Ergebnisfelder.
Das habe ich jetzt verstanden, danke Euch beiden!
Grüße
Andreas