Direkt zum Hauptinhalt springen
eLearner.app
Modul 3 · Lektion 3 von 411/57 im Kurs~10 min
Lektionen des Moduls (3/4)

Gruppieren mit GROUP BY

In Modul 2 haben Sie gelernt, dass COUNT(*), AVG(...), SUM(...) alle reduzieren Zeilen zu einer einzelnen Ergebniszeile. Aber was ist, wenn Sie ein durchschnittliches Gehalt wünschen? für jede Abteilung, nicht für das gesamte Unternehmen? Sie möchten eine Zeile pro Gruppe. Das ist die Aufgabe von GROUP BY.

Die Syntax

SQL
SELECT grouping_column, AGGREGATE_FUNCTION(...)
FROM   table
GROUP BY grouping_column;

Lesen Sie auf Englisch: "Teilen Sie die Zeilen in Gruppen auf, die den gleichen Wert von haben grouping_column und berechnen Sie für jede Gruppe das Aggregat „.

SQL
-- Average salary per department:
SELECT department_id, AVG(salary) AS average
FROM   employees
GROUP BY department_id;

Das Ergebnis enthält eine Zeile für jeden eindeutigen department_id, der in gefunden wird employees. Sie erhalten 5 Zeilen: eine für jede der 4 Abteilungen (1, 2, 3, 4) plus eins für NULL (Andrea Costa).

Mit JOIN für lesbare Namen

Oft möchten Sie nach department_id gruppieren, aber den Namen des anzeigen Abteilung. Sie kombinieren GROUP BY mit einem JOIN:

SQL
SELECT d.name AS department,
       COUNT(*)    AS count,
       AVG(e.salary) AS average_salary
FROM   employees   AS e
JOIN   departments AS d ON e.department_id = d.id
GROUP BY d.name
ORDER BY count DESC;

Dies ist eine vollwertige Business-Intelligence-Abfrage: in drei Zeilen sagt Ihnen, wie viele Mitarbeiter jede Abteilung hat und wie viel sie damit verdienen Durchschnitt, sortiert vom größten zum kleinsten.

Die goldene Regel

Wenn Sie GROUP BY verwenden, muss jede Spalte in SELECT sein:

  1. eine der Gruppierungsspalten (z. B. department_id, d.name) oder
  2. innerhalb einer Aggregatfunktion (z. B. AVG(salary), COUNT(*)).
SQL
-- ERROR: first_name is neither in GROUP BY nor inside an aggregate
SELECT department_id, first_name, AVG(salary)
FROM   employees
GROUP BY department_id;

PostgreSQL gibt einen expliziten Fehler zurück (“Spalte muss in der GROUP BY erscheinen Klausel oder in einer Aggregatfunktion verwendet werden"). Es ist eine übliche frühe Woche Fehler: Wenn Sie es sehen, halten Sie inne und fragen Sie sich: „Was ist der Wert davon?“ first_name für eine Gruppe von 3 Personen?“_ – es gibt keine einheitliche Antwort, und Deshalb weigert sich der Motor.

Probieren Sie es aus

Übung#sql.m3.l3.e1
Versuche: 0Wird geladen…

Berechnen Sie für jede Abteilung, wie viele Mitarbeiter sie beschäftigt. Geben Sie zwei Spalten zurück: den Abteilungsnamen (departments.name) und die Mitarbeiterzahl. Eine Zeile pro Abteilung.

Editor wird geladen…
Hinweis anzeigen

Mit COUNT(*) aggregieren und nach d.name gruppieren. Die SELECT-Anweisung darf nur die Gruppierungsspalte und das Aggregat enthalten.

Lösung nach 3 Versuchen verfügbar

Wiederholungsübung

Übung#sql.m3.l3.e2
Versuche: 0Wird geladen…

Berechnen Sie für jede Abteilung (departments.name) das durchschnittliche Gehalt (AVG(salary)) ihrer Mitarbeiter, sortiert vom höchsten zum niedrigsten.

Editor wird geladen…
Hinweis anzeigen

AVG(e.salary) als Aggregat, GROUP BY d.name, ORDER BY Average DESC.

Lösung nach 3 Versuchen verfügbar