Jürgen: GROUP BY-KLAUSEL IN SQL

Hallöchen,

ich versuche mich seit ein paar Wochen an SQL und greife dabei auf eine Oracle-DB zu.

Nun probiere ich gerade GROUP BY zu verstehen, aber irgendwie liefert mir das Programm immer Fehlermeldungen.

Angenommen ich möchte mir Daten nach der Adresse gruppieren lassen, müsste er mir ja alle, die die gleiche Adresse besitzen zusammen ausgeben.

SELECT NAME,ADRESSE,TELEFONNUMMER,COUNT(NAME)
FROM TESTTABELLE
WHERE NAME LIKE 'A%'
GROUP BY ADRESSE

Leider bringt er aber die Fehlermeldung :

ERROR at line 1:
ORA-00979: not a GROUP BY expression

Nun hab ich ein wenig rumprobiert und dabei herausgefunden das wenn ich alle im SELECT aufgeführten Bezeichner auch im GROUP BY hinschreibe funktioniert es. Aber leider möchte ich das ja nicht.

SELECT NAME,ADRESSE,TELEFONNUMMER,COUNT(NAME)
FROM TESTTABELLE
WHERE NAME LIKE 'A%'
GROUP BY NAME,ADRESSE,TELEFONNUMMER

Kann mir jemand helfen, bzw. sagen was ich verkehrt mache? Vielleicht gibt es ja auch irgendwo ne Site zu dem Thema...

thanx for your help
Jürgen

  1. Hi,

    SELECT NAME,ADRESSE,TELEFONNUMMER,COUNT(NAME)

    dieses COUNT(*)[1] bezieht sich auf NAME, ADRESSE _und_ TELEFONNUMMER, also musst Du _alle_ diese Spalten in der GROUP BY-Klausel stehen haben. Genauer gesagt: Alle Ergebnisspalten, die keine Gruppenfunktion sind.

    Aber leider möchte ich das ja nicht.

    Was möchtest Du denn? Worauf soll sich Deiner Meinung nach das COUNT(*) beziehen? Und _warum_ meinst Du, dass es das tut?

    Cheatah

    [1] Es _ist_ ein COUNT(*), denn COUNT(NAME) zählt alle Zeilen, die über eine Spalte "NAME" verfügen, was mit den Zeilen, die über eine beliebige Spalte verfügen identisch ist.

    1. Servus,

      der Ansatz klingt gut...ich denke mal da liegt mein Fehler!

      Also ich weis nur das ich eine Aggregatsfunktion(z.B. COUNT()) brauche um das GROUP BY machen zu können....was ich bei dieser Funktion genau machen muss weis ich halt nicht.

      sollte ich vielleicht statt Count ne andere Funktion nehmen? SUM() oder sowas? Hat die Funktion einen direkten Einfluss auf mein GROUP BY? Wenn ja welchen??

      Was möchtest Du denn?

      Ich möchte nach einer bestimmten Spalte gruppieren, um z.B. alle mit der gleichen Adresse zusammen anzeigen zu lassen und dann aber trotzdem die Namen alphabetisch sortiern zu können

      also

      Friedrich             Berliner Str.
      Müller                Berliner Str.
      ....

      1. Moin Moin !

        Was möchtest Du denn?

        Ich möchte nach einer bestimmten Spalte gruppieren, um z.B. alle mit der gleichen Adresse zusammen anzeigen zu lassen und dann aber trotzdem die Namen alphabetisch sortiern zu können

        also

        Friedrich             Berliner Str.
        Müller                Berliner Str.
        ....

        Wie wäre es mit SELECT NAME,ADRESSE FROM TABELLE ORDER BY ADDRESSE,NAME ?

        Alexander

        1. Hi Alexander,

          Wie wäre es mit SELECT NAME,ADRESSE FROM TABELLE ORDER BY ADDRESSE,NAME ?

          ja im Prinzip schon, aber dann sortiert er zuerst nach den Adressen und dann nach den Namen. Es ist aber nicht ganz so wie es ausssehen soll. Denn so einfach wie ichs beschrieben hab ist meine Problematik leider nicht und leider ist es schwer zu erklären...verstehe es ja selbst kaum.

          Darum suche ich halt Hilfe zu Group By....das was im Internet steht ist immer nur ziemlich an der Oberfläche gekratzt.

          Aber trotzdem danke für deine Hilfe!

          Jürgen

          1. Moin!

            ja im Prinzip schon, aber dann sortiert er zuerst nach den Adressen und dann nach den Namen. Es ist aber nicht ganz so wie es ausssehen soll. Denn so einfach wie ichs beschrieben hab ist meine Problematik leider nicht und leider ist es schwer zu erklären...verstehe es ja selbst kaum.

            Wenn du selbst nicht weißt, was du willst, wie sollen wir das denn wissen?

            Es ist daher wahrscheinlich, daß du nicht gruppieren willst, sondern etwas anderes. Aber was du willst, ist eben solange unbekannt, solange du nicht als Beispiel mal rausrückst, welche Daten deine Tabelle enthält, und welche Daten du als Ergebnis haben willst.

            - Sven Rautenberg

      2. Hi,

        Also ich weis nur das ich eine Aggregatsfunktion(z.B. COUNT()) brauche um das GROUP BY machen zu können....

        umgekehrt wird ein Schuh draus: Wenn Du eine Aggregatsfunktion verwendest, brauchst Du GROUP BY.

        sollte ich vielleicht statt Count ne andere Funktion nehmen? SUM() oder sowas?

        Wenn Du weder COUNT() noch SUM() brauchst, dann las es weg.

        Hat die Funktion einen direkten Einfluss auf mein GROUP BY?

        Nein.

        Ich möchte nach einer bestimmten Spalte gruppieren,

        Gruppieren bedeutet, dass Du implizite Tabellen erzeugst, aus denen *eine* Ergebniszeile generiert wird. Gruppierst Du (nur) nach ADRESSE, so erhälst Du pro Adresse *ein* Ergebnis.

        Desweiteren stimme ich Sven zu... erzähl bitte erst mal, was Du eigentlich aus welchen vorliegenden Daten erhalten möchtest.

        Cheatah

      3. Hallo,

        Ich möchte nach einer bestimmten Spalte gruppieren, um z.B. alle mit der gleichen Adresse zusammen anzeigen zu lassen und dann aber trotzdem die Namen alphabetisch sortiern zu können

        Friedrich             Berliner Str.
        Müller                Berliner Str.
        ....

        GROUP BY dient alleine dazu Auswertung zu erzeugen, wobei ein oder mehrere Felder den gleichen Wert besitzen. Also für Fragestellungen wie:
        Sage mir, wieviele Personen pro Straße es gibt.
        (select ORT,STRASSE,count(*) from ADRESSEN group by ORT,STRASSE)

        Das Ergebnis kann dann sein:

        Winzdorf  Gartenweg      3
        Winzdorf  Hauptstraße   18
        Berlin    Upsgasse      13
        ...

        Du kannst aber nicht
        select ORT,STRASSE,COUNT(*) from ADRESSEN group by ORT
        verwenden. Woher soll die Datenbank wissen, welche der möglichen Straßen im Ergebnis einfließen soll, und welche nicht (Gartenweg oder Hauptstraße).

        Wenn Du sortieren willst, mußt Du Dich entscheiden wonach du zuert sortieren willst, und wonach sonst noch. Es geht einfahc nicht ZWar alle Namen zu sortieren, aber die Strassen auch mit zu berücksichtigen, daß diese quasi zusammenbleiben. Ein Feld muß unbedingt Vorrang haben. Versuche einmal im Windowsexplorer die Dateien im System32-Verzeichnis so zu sortieren, daß zwar die Dateinamen streng aufsteigend sind, aber trotzdem alle Dateien mit gleichem Änderungsdatum zusammen anhgezeigt werden. Du wirst sehen, daß Du das einfach nicht hinkriegst. Und genausowenig funktioniert das in einer Datenbank.

        Grüße
          Klaus

  2. hi, Jürgen

    wenn du Aggregatfunktionen (sum, max, usw) benutzt und gleichzeitig andere Spalten in der select-Klausel ausgibst, müssen diese gruppiert werden (weil die Aggregatfunktion ja zusammenfassen).
    Für komplizierte Abfragen bieten sich dann Unterabfragen an.

    na ja, vermutlich nix Neues, abba vieleicht hilfts ja

    Dein Onkel