Announcement

Collapse
No announcement yet.

Problem mit GROUP BY

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Problem mit GROUP BY

    Hei.

    also ich habe die tabellen

    Cocktail(cid,cname,alkohol,gid)
    Lokal (lid,lname,plz,stadt)
    cocktail_lokal (cid,gid)

    Und ich suche alle lokale wo kein 'GinTonic' serviert wird.

    mein Ansatz ist erstmal die drei Tabellen zu vereinigen

    SELECT l.lname,l.lid FROM lokal l JOIN cocktail_lokal cl ON l.lid=cl.lid
    JOIN cocktail c ON c.cid=cl.cid

    dann würde ich sie nach l.lname gruppieren

    GROUP BY l.lname

    und dann meine Bedingung im WHERE anhängen

    WHERE c.cname!='GinTonic' ;

    dann bekomm ich aber den FEhler "SQL command not properly ended! Zeile 3 Spalte 22"
    also gehe ich davon aus dass ich bei meinem Group by was falsch mache ..

    Ideen?

    Danke schonmal

  • #2
    Hallo,

    deine Beschreibung klingt zwar danach, dass die Reihenfolge deiner Gedanken deutlich wird; aber ich bezweifle, dass das noch zur Reihenfolge im SQL-Befehl passt. WHERE kommt nämlich direkt nach den Tabellen.

    Bitte schreib die jetzige exakte Fassung des vollständigen SELECTs auf, dann kann man konkret antworten. Unter anderem kommt es nämlich auf die Reihenfolge der Klauseln an, siehe z.B. wikibooks: Einführung in SQL: SELECT.

    Übrigens kann man eine "nicht vorhanden"-Abfrage per OUTER JOIN lösen (siehe ebendort in einem anderen Kapitel).

    Gruß Jürgen

    Comment


    • #3
      Hallo,
      Originally posted by strahli View Post
      ...Und ich suche alle lokale wo kein 'GinTonic' serviert wird.

      mein Ansatz ist erstmal die drei Tabellen zu vereinigen

      SELECT l.lname,l.lid FROM lokal l JOIN cocktail_lokal cl ON l.lid=cl.lid
      JOIN cocktail c ON c.cid=cl.cid

      dann würde ich sie nach l.lname gruppieren

      GROUP BY l.lname

      und dann meine Bedingung im WHERE anhängen

      WHERE c.cname!='GinTonic' ;
      1. Für eine Gruppierung MÜSSEN im Group By ALLE Felder aufgeführt werden, die auch im Select-Teil stehen und keine aggregierten Felder sind. Also fehlt schonmal l.id
      2. Macht eine Gruppierung OHNE Aggregierung keinen Sinn. Wenn es nur um die Zusammenfassung gleicher DS geht genügt ein DISTINCT
      3. Kommt die Where-Klausel, wie Jürgen schon sagte, VOR der Group By-Klausel
      Und 4. bekommst du damit eine Auflistung aller Lokale die irgendwelche Drinks neben GinTonic anbieten. Das entspricht nicht wirklich der Aufgabenstellung .

      Jürgen hat es bereits angedeutet, die Lösung geht hierbei über einen OUTER JOIN, Gruppierung wird dafür nicht benötigt.

      [highlight=sql]
      SELECT distinct l.lname, l.lid
      FROM lokal l
      LEFT JOIN cocktail_lokal cl ON cl.lid = l.lid
      LEFT JOIN cocktail c ON c.cid = cl.cid AND c.cname = 'GinTonic'
      where c.cid is null
      [/highlight]

      Gruß Falk
      Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

      Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

      Comment


      • #4
        danke für eure Antworten - ihr habt recht, meine REihenfolge der Klauseln stimmte nicht.

        mit der Anfrage von Falk , bekomme ich aber nicht nur die Lokale wo kein GinTonic serviert wird sondern alle Lokale wo noch andere Drinks als GinTonic serviert werden,

        die ausgabe beinhaltet alle 13 Lokale die drinks anbieten und unter denen sind nun auch die welche neben gintonic noch andere Getränke anbieten..

        Soweit war ich mit meinen vorherigen Anfragen auch schon mal .. ich weiß aber nicht wie ich die Lokale ganz ausschliessen kann, welche Gintonic servieren...

        Comment


        • #5
          OK, durch den doppelten LEFT JOIN passt das nicht mehr.
          Der eine JOIN muß ein INNER JOIN sein und damit er den LEFT JOIN nicht kaputt macht noch in eine Subquery gepackt werden:

          [highlight=sql]
          SELECT l.lname, l.lid
          FROM lokal l
          LEFT JOIN (
          select cl.lid
          from cocktail_lokal cl
          inner join cocktail c ON c.cid = cl.cid AND c.cname = 'GinTonic') icl on icl.lid = l.lid
          WHERE icl.lid IS NULL
          [/highlight]

          Gruß Falk
          Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

          Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

          Comment


          • #6
            Falsch verstanden. Hier stand nix gutes

            Comment


            • #7
              okay.. den hab ich verstanden .. aber ich komm mit ner weitern GROUP BY sache wieder nicht hin



              Soweit bin ich, hab die tabellen Zutat, zutat_cocktail und cocktail zusammengefügt

              [highlight=sql]
              SELECT c.cname ,zc.menge,z.zname, z.alkoholgehalt FROM
              cocktail c INNER JOIN zutat_cocktail zc ON c.cid=zc.cid
              INNER JOIN zutat z ON z.zid=zc.zid
              [/highlight]

              jetzt soll ich allerdings nicht die bestimmten Namen, die menge und den alkoholgehalt ausgeben, sondern berechnen welchen ALkoholgehalt jeder der Cocktails hat.
              Gegeben hab ich dazu die Formel: (Summe ( Alkoholgehalt der Zutat*Menge der Zutat))/(Menge aller Zutaten)

              das würde ich jetzt wie folgt realisieren
              [highlight=sql]
              SELECT c.cname, (SUM(COUNT(z.zid)*zc.menge))/ (COUNT(z.zid))
              FROM
              cocktail c INNER JOIN zutat_cocktail zc ON c.cid=zc.cid
              INNER JOIN zutat z ON z.zid=zc.zid
              GROUP BY c.cname;
              [/highlight]

              Hier kommt dann mein Problem: Fehler "not a single group function"

              ich schätze der Fehler hat was mit meiner Berechnung zu tun, aber ich weiß nicht wie ich das abändern kann

              Danke schonmal!

              Comment


              • #8
                Originally posted by strahli View Post
                Gegeben hab ich dazu die Formel: (Summe ( Alkoholgehalt der Zutat*Menge der Zutat))/(Menge aller Zutaten)
                Und wenn Du es einfach so machst, wie in Deiner Formel beschrieben?
                [highlight=sql]
                SELECT c.cname, SUM(z.alkoholgehalt *zc.menge) / SUM(zc.Menge)
                FROM cocktail c
                JOIN zutat_cocktail zc ON c.cid=zc.cid
                JOIN zutat z ON z.zid=zc.zid
                GROUP BY c.cname;
                [/highlight]

                Comment

                Working...
                X