Anita: sql abfrage auflistung häufigste/wenig häufigste nennungen

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

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

    --
    -------------------
    Let Bygones Be Bygones  --  Robert Pitscottie: "Chronicles of Scotland"
    1. 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

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

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

        --
        -------------------
        Wenn du die Nadel im Heuhaufen nicht findest, zünde den Heuhaufen an.
        1. 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