Andreas: Wieder ein SQL Problem mit HAVING/WHERE

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

  1. 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

    1. 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

      1. 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

        1. 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