3.8 GROUP BY

Mit Hilfe der GROUP BY-Klausel können Datensätze des Abfrageergebnisses, die in einer oder mehreren Spalten gleiche Werte besitzen, zu jeweils einer Gruppe zusammengefasst werden. Häufig werden dabei im SELECT-Abschnitt Aggregatfunktionen eingesetzt, um für jede Gruppe die Werte ausgewählter Spalten zu aggregieren (zum Beispiel Addieren, Mittelwert bilden, größten bzw. kleinsten Wert ermitteln).

Beispiele

[Hinweis: Für dieses Beispiel wurde die Tabelle Fahrrad um zwei Datensätze erweitert.]

Die Tabelle Fahrrad wird um zwei Datensätze erweitert.
SQL
INSERT INTO Fahrrad(ID, Kennung, Anschaffungskosten, Fahrradtyp_ID)
VALUES (3, "Silver#1", 850.0, 2),
       (4, "Winter#1", 730.0, 1);
Abb. 3-92: SQL-Anweisung
  1. Gewünscht wird eine Übersicht, die die Summe der Anschaffungskosten je Fahrradtyp (Fahrradtyp_ID) ausweist.

    Die Tabelle Fahrrad enthält sowohl die Fahrradtyp_ID als auch die Anschaffungskosten eines jeden Fahrrads.

    Tabelle Fahrrad

    ID Kennung Anschaffungskosten ↑Fahrradtyp_ID
    1 Cross#7 670.00 1
    2 Mark#2 750.00 2
    3 Silver#1 850.00 2
    4 Winter#1 730.00 1
    Abb. 3-93: Tabelle Fahrrad

    Mit Hilfe der GROUP BY-Klausel fassen wir im Abfrageergebnis alle Datensätze, die in der Spalte Fahrradtyp_ID den gleichen Wert besitzen, zu einer Gruppe zusammen. Die Aggregatfunktion SUM(Anschaffungskosten) addiert nun für jede Gruppe die Werte der Spalte Anschaffungskosten.

    SQL
    SELECT Fahrradtyp_ID, SUM(Anschaffungskosten) AS Anschaffungskosten
    FROM Fahrrad
    GROUP BY Fahrradtyp_ID;
    Abb. 3-94: SQL-Anweisung

    Abfrageergebnis

    Fahrradtyp_ID Anschaffungskosten
    1 1400.00
    2 1600.00
    Abb. 3-95: Abfrageergebnis der SQL-Anweisung aus Abb. 3-94.
  2. Gewünscht wird eine Übersicht, die die Anzahl der Fahrräder je Fahrradtyp (Fahrradtyp_ID) ausweist.

    SQL
    SELECT Fahrradtyp_ID, COUNT(*) AS Anzahl
    FROM Fahrrad
    GROUP BY Fahrradtyp_ID;
    Abb. 3-96: SQL-Anweisung

    Abfrageergebnis

    Fahrradtyp_ID Anzahl
    1 2
    2 2
    Abb. 3-97: Abfrageergebnis der SQL-Anweisung aus Abb. 3-96.

Mit Hilfe der GROUP BY-Klausel können im Abfrageergebnis Datensätze zu Gruppen zusammengefasst werden. In der SELECT-Klausel kann dann festegelegt werden, dass für jede Gruppe bestimmte Daten der betroffenen Datensätze aggregiert (zum Beispiel addiert) werden.

SQL
SELECT [DISTINCT] spalte [, ...]
FROM tabelle [INNER JOIN tabelle2 ON tabelle.fremdschlüssel = tabelle2.primärschluessel]
[WHERE bedingung]
[GROUP BY spalte [, ...]]
[ORDER BY {spalte [ASC|DESC]} [, ...]];
Abb. 3-99: SQL Syntax – SELECT-Anweisung inklusive GROUP BY-Abschnitt
Merke: Gruppieren von Datensätzen im Abfrageergebnis
Aufgabe

Aufgabe 3-13: Gruppierung

Datenbank Firmenwagen

Erstellen Sie jeweils eine SQL-Anweisung, die als Abfrageergebnis eine Tabelle mit den gewünschten Daten zurückgibt:

  1. Gewünscht wird eine Übersicht, die die Summe der Anschaffungskosten je Fahrzeugmodell (Fahrzeugmodell_ID) ausweist. Lösung
    Lösung
    SQL
    SELECT Fahrzeugmodell_ID, SUM(Anschaffungskosten) AS Kosten
    FROM Fahrzeug
    GROUP BY Fahrzeugmodell_ID;
    Abb. 3-100: SQL-Anweisung
  2. Gewünscht wird eine Übersicht, die für alle vorhandenen Fahrzeugmodelle (Modellbezeichnung) jeweils den Durchschnitt der Anschaffungskosten aller Firmenwagen des jeweiligen Modells ausweist. Lösung
    Lösung
    SQL
    SELECT Bezeichnung, AVG(Anschaffungskosten) AS AK_Durchschnitt
    FROM Fahrzeug INNER JOIN Fahrzeugmodell ON Fahrzeugmodell_ID=Fahrzeugmodell.ID
    GROUP BY Fahrzeugmodell.ID;
    Abb. 3-101: SQL-Anweisung
  3. Gewünscht wird eine Übersicht, die für alle Mitarbeiter (Nachname und Vorname) jeweils die Anzahl der Reservierungen ausweist. Lösung
    Lösung
    SQL
    SELECT Nachname, Vorname, COUNT(*) AS Anzahl_Reservierungen
    FROM Reservierung INNER JOIN Mitarbeiter ON Mitarbeiter_ID = Mitarbeiter.ID
    GROUP BY Mitarbeiter.ID;
    Abb. 3-102: SQL-Anweisung
  4. Gewünscht wird eine Übersicht, die für alle vorhandenen Fahrzeugmodelle (Hersteller und Modellbezeichnung) jeweils die Anzahl der von diesem Modell vorhandenen Firmenwagen ausweist. Lösung
    Lösung
    SQL
    SELECT Hersteller, Bezeichnung, COUNT(*) AS Anzahl
    FROM Fahrzeug INNER JOIN Fahrzeugmodell ON Fahrzeugmodell_ID=Fahrzeugmodell.ID
    GROUP BY Fahrzeugmodell.ID;
    Abb. 3-103: SQL-Anweisung
  5. Gewünscht wird eine Übersicht, die für jedes Fahrzeugmodell (Hersteller und Modellbezeichnung) die bisher angefallenen Instandhaltungskosten ausweist. Lösung
    Lösung
    SQL
    SELECT Hersteller, Bezeichnung, SUM(Kosten) AS Gesamtkosten
    FROM Fahrzeug
      INNER JOIN Fahrzeugmodell
        ON Fahrzeugmodell_ID=Fahrzeugmodell.ID
      INNER JOIN Instandhaltung
        ON Fahrzeug.ID=Fahrzeug_ID
    GROUP BY Fahrzeugmodell.ID;
    Abb. 3-104: SQL-Anweisung
  6. Gewünscht wird eine Übersicht, die für alle Hersteller (Herstellerbezeichnung) jeweils die Anschaffungskosten des teuersten von diesem Hersteller bisher angeschafften Fahrzeugs ausweist. Lösung
    Lösung
    SQL
    SELECT Hersteller, MAX(Anschaffungskosten) AS AK_Max
    FROM Fahrzeug INNER JOIN Fahrzeugmodell ON Fahrzeugmodell_ID=Fahrzeugmodell.ID
    GROUP BY Hersteller;
    Abb. 3-105: SQL-Anweisung