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

OtenMoten

Benutzer
Beiträge
15
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
 
Werbung:
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!
 
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!

Danke für deine Antwort!

HAVING wurde noch im Buch bis dahin noch nicht behandelt. Kennst du noch eine Alternativ-Lösung?
 
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?

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

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

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:
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!!
 
Werbung:
Das klingt etwas widersprüchlich...

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

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. :)
 
Zurück
Oben