sql abfrage auflistung häufigste/wenig häufigste nennungen
Anita
- datenbank
Hallo,
ich stehe relativ am Anfang mit Datenbankprogrammierung und habe nun folgendes Problem. Ich habe mir eine Testdatenbank erstellt mit verschiedenen Tabellen. Eine Tabelle heißt "Land". In der Tabelle sind u.a. unterschiedliche Länder erfasst. Nun möchte ich gerne abfragen, welches Land am häufigsten und welches Land am seltensten genannt wurde. Meine Tabelle enthält dreimal Deutschland, zweimal Frankreich und einmal England.Ich weiß nicht, wie ich es lösen kann, dass mir meine Abfrage Deutschland als häufigst genanntes Land bringt, und England als seltenstes. Wenn ich mit COUNT bzw. MAX/MIN arbeite, dann funktioniert das nicht. Da bekomme ich "6" bzw. Deutschland als MIN (vermutlich wegen dem Alphabet). Kann mir hier eventuell jemand helfen.
Danke,
Anita
Hello,
vermutlich hast du COUNT falsch eingesetzt. COUNT ist, genau wie MAX, MIN, AVG und Konsorten, eine Aggregatfunktion, die sich immer auf eine Gruppe von Datensätzen bezieht. Auf welche, das hängt sehr vom Kontext ab - Beispiel:
SELECT land, COUNT(land)
FROM table
Du führst eine Abfrage aus, die ALLE Länder zurückgibt und sagst zur Datenbank "nun zähle" - das mag dich irritieren, aber du hast ihm nicht gesagt woraus die Gruppe besteht, dementsprechend geht das DBMS davon aus, dass du alle Datensätze als eine Gruppe betrachten möchtest und zählt alle Datensätze. In deinem Fall also 6.
Deutschland|6
Deutschland|6
Deutschland|6
Frankreich|6
Frankreich|6
England|6
Du möchtest etwas anderes, du möchtest 3 Gruppen, nämlich die Gruppe Deutschland, die Gruppe Frankreich und die Gruppe England. Warum ausgerechnet das Gruppen sind wird dir vermutlich im Laufe der Zeit einleuchten, wenn du mit mehr Beispielen in dem Zusammenhang arbeitest. Für den Augenblick reicht es sich zu überlegen, dass du vor dir 3 Eimer stehen hast, in jeden Eimer schmeißt du Datensätze eines Landes und am Ende zählst du wieviel da drin sind.
Deine Abfrage spiegelt genau das wieder
SELECT land, COUNT(land)
FROM tabelle
GROUP BY land -- hier schmeißen wir alles in die Töpfe
Jetzt hat sich der Kontext für das Count geändert - plötzlich besteht eine Gruppe immer aus einem eindeutigen Land und der zugehörigen Zahl von Datensätzen. Dementsprechend wird dein Ergebnis jetzt wie folgt aussehen, beachte dabei insbesondere, dass es nicht mehr 6 Ergebnisse gibt, sondern genau die drei Gruppen (Eimer):
Deutschland|3
Frankreich|2
England|1
MfG
Rouven
Hallo Rouven,
ich habs gerade ausprobiert, und das ist genau das, was ich gesucht habe. Und dank Deiner Erklärung habe ich jetzt auch verstanden, was ich gemacht habe (was ja eigentlich das Wichtigste ist...).
Also vielen Dank und einen schönen Tag!
Anita
Hallo,
so, ich habe jetzt etwas "rumgetüfftelt" und soweit klappt das auch schon:
SELECT Länderkürzel AS Land, COUNT(Länderkürzel) AS Nennung
FROM TEILNEHMER
GROUP BY Länderkürzel
HAVING (COUNT(Länderkürzel) = 2)
Da bekomme ich dann auch das Land (Frankreich), das zweimal genannt wurde. Mir ist noch nicht so ganz klar, wo ich jetzt das MIN/MAX hinpacken soll.
Wäre super, wenn Du mir hier nochmal auf die Sprünge helfen könntest...
Vielen Dank!
Anita
Hello,
oh sag doch bitte nicht, dass du nur die häufigste Nennung haben möchtest...mach doch nicht sowas, das macht doch gar keinen Spaß.
Vinzenz, Ilja, das ist einer für euch...
Vielleicht hilft dir etwas Spieliere mit Vinzenz Archivbeitrag zum Thema korrelierte Unterabfragen weiter. Du wirst das GROUP BY dort allerdings noch einflechten müssen.
MfG
Rouven
yo,
Vinzenz, Ilja, das ist einer für euch...
geht auch ohne korrelation....
ich hoffe mal, das dbms kann unterabfragen, bei mysql gehen diese ab version 4.1+. Ü und Ä in den spaltennamen zu benutzen ist keine gute sache, davon würde ich dir abraten.
SELECT t1.Länderkürzel , count(*)
FROM teilnehmer t1
GROUP BY t1.Länderkürzel
HAVING COUNT(*) = (SELECT MAX(*)
FROM (SELECT COUNT(*)
FROM teilnehmer t2
GROUP BY t2.Länderkürzel
) tab
)
OR COUNT(*) = (SELECT MIN(*)
FROM (SELECT COUNT(*)
FROM teilnehmer t2
GROUP BY t2.Länderkürzel
) tab
)
;
Ilja