1. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

Abfrage: Unter welcher Postleitzahl haben Sie mehr als einen Kunden?

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von OtenMoten, 26 September 2017.

  1. OtenMoten

    OtenMoten Benutzer

    Hallo Forenmitglieder,

    nach langem und anstrengenden Überlegen habe ich mich entschieden euch nach Hilfe zu fragen.

    Die Relationen:
    Imgur: The most awesome images on the Internet
    Die Frage im Buch lautet wie auch im Betreff:
    "Unter welcher Postleitzahl haben Sie mehr als einen Kunden?"

    Mir brennt der Kopf und ich komme auf keine Lösung. Meine Basis mit der ich gearbeitet habe ist:
    SELECT COUNT(name), plz
    FROM kunde
    GROUP BY plz;

    Dies listet mir die Anzahl von Personen pro PLZ auf. Ich möchte alle PLZs anzeigen lassen, die mehr als 1 Kunde haben.

    Liebe Grüße
     
  2. akretschmer

    akretschmer Datenbank-Guru

    HAVING ist Dein Freund.

    select plz, count(1) from kunden group by plz having count(1) > 1;

    PS.: Dein Bild-Link funktioniert nicht. Es ist eh besser, das Problem zu beschreiben. Oft versteht man es dabei dann auch selber. Probier es aus!
     
  3. OtenMoten

    OtenMoten Benutzer

    Danke für deine Antwort!

    HAVING wurde noch im Buch bis dahin noch nicht behandelt. Kennst du noch eine Alternativ-Lösung?
     
  4. akretschmer

    akretschmer Datenbank-Guru

    Wer oder was hindert Dich, im Buch mal 2 Seiten vorwärts zu blättern?

    Du kannst auch mit einem Subselect arbeiten. Kam das schon im Buch?
     
  5. OtenMoten

    OtenMoten Benutzer

    Ja, Subselect wurde behandelt. Ich habe sämtliche Code-Variationen in den letzten beiden Stunden versucht.
    Ich komme zu keinem Ergebnis. Jede andere Frage konnte ich schnell abarbeiten. Bisher war das Buch auch sehr verständlich nur jedoch
    diese Frage lässt mich verzweifeln.
     
  6. ukulele

    ukulele Datenbank-Guru

    Code:
    SELECT t.name,t.anzahl FROM (
    SELECT k.name,count(*) AS anzahl
    FROM kunde k
    ) t
    WHERE t.anzahl > 1
    Es geht auch mit EXISTS:
    Code:
    SELECT k.*
    FROM kunde k
    WHERE EXISTS (
    SELECT 1
    FROM kunde
    WHERE kunde.plz = k.plz
    AND kunde.id <> k.id
    )
    Oder per Join:
    Code:
    SELECT DISTINCT k1.*
    FROM kunde k1
    INNER JOIN kunde k2
    ON k1.plz = k2.plz
    AND k1.id <> k2.id
    Oder mit IN, oder oder...
     
    Walter gefällt das.
  7. OtenMoten

    OtenMoten Benutzer

    Hallo ukulele,

    Danke für deine Antwort! Alle bis auf die erste Abfrage haben super funktioniert!

    Code:
    SELECT t.name, t.anzahl
    FROM (SELECT k.name, count(*) AS anzahl FROM kunde k) t
    WHERE t.anzahl > 1
    
    Gibt die Fehlermeldung:
    "Column 'kunde.name' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause."
     
    Zuletzt bearbeitet: 27 September 2017
  8. ukulele

    ukulele Datenbank-Guru

    Code:
    SELECT t.name, t.anzahl
    FROM (SELECT k.name, count(*) AS anzahl FROM kunde k GROUP BY k.name) t
    WHERE t.anzahl > 1
    Ja sry gleich das offensichtliche übersehen, das hättest du aber auch selbst gekonnt :)
     
  9. OtenMoten

    OtenMoten Benutzer

    Ich hatte die GROUP BY Klausel angehängt, jedoch ist das Ergebnis 'leer'. Es wird leider kein Datensatz angezeigt.

    Habe es abgeändert und es funktioniert nun:
    Code:
    SELECT t.anzahl, t.plz
    FROM (SELECT k.plz, count(*) AS anzahl FROM kunde k GROUP BY k.plz) t
    WHERE t.anzahl > 1
    
    Danke für deine Unterstützung!
     
    Zuletzt bearbeitet: 27 September 2017
  10. OtenMoten

    OtenMoten Benutzer

    Eins muss ich noch los werden:

    Anfangs sagte ich:

    "Das ist meine Basis"
    Code:
    SELECT COUNT(name), plz
    FROM kunde
    GROUP BY plz;
    
    Ich hatte diese Query unter der FROM-Klausel eingefügt und versuchte mit der WHERE-Klausel der übergeordneten Query die Anzahl > 1 abzufragen.
    Ich erhielt immer einen Syntax-Fehler.

    Naja, ich bin froh, dass sich meine Logik/Denkweise bestätigt hat.

    Vielen Dank euch allen!!
     
  11. akretschmer

    akretschmer Datenbank-Guru

    Das klingt etwas widersprüchlich...

    WHERE filtert Datensätze, bevor diese z.B. aggregiert werden, HAVING danach.
     
  12. OtenMoten

    OtenMoten Benutzer

    Wieso widersprüchlich?

    Die WHERE-Klausel wird auf die FROM-Klausel angewendet?!
    Also schnappe ich mir erst die Anzahl der Namen pro PLZ, welche ich in eine virtuelle bzw. temporäre Tabelle und wende darauf die WHERE-Klausel der übergeordneten Abfrage an. :)
     
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