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
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 „.
-- 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:
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:
- eine der Gruppierungsspalten (z. B.
department_id,d.name) oder - innerhalb einer Aggregatfunktion (z. B.
AVG(salary),COUNT(*)).
-- 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
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.
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
Berechnen Sie für jede Abteilung (departments.name) das durchschnittliche Gehalt (AVG(salary)) ihrer Mitarbeiter, sortiert vom höchsten zum niedrigsten.
Hinweis anzeigen
AVG(e.salary) als Aggregat, GROUP BY d.name, ORDER BY Average DESC.
Lösung nach 3 Versuchen verfügbar