Datensätze gruppieren
GROUP BY in SQL ist ein mächtiges Werkzeug, mit dem sich Datensätze in Gruppen unterteilen lassen, die den gleichen Wert in bestimmten Spalten haben.
GROUP BY wird verwendet, wenn man aggregierte Informationen aus einer Tabelle erhalten möchte, z. B.:
- Wie viele Filme gibt es pro Kategorie?
- Wie viele Kunden hat jeder Mitarbeiter?
- Wie viel Umsatz wurde pro Kunde gemacht?
Syntax von GROUP BY
SELECT spalte1, AGGREGATFUNKTION(spalte2)
FROM tabelle
GROUP BY spalte1;
Dabei ist Aggregatfunktion
eine von den 5 Aggregatfunktionen
Datenwolke
Im Bild stellt die Gesamtwolke die Menge aller Datensätze in einer Tabelle (das kann auch eine gejointe Tabelle sein) dar. Jeder Punkt steht für einen Datensatz.
Mit GROUP BY
wird diese Menge in Gruppen eingeteilt, jeder Datensatz wird genau einer Gruppe zugeteilt.
Auf jede dieser Gruppen kann dann eine Aggregatfunktion angewendet werden.
Beispiele
Wir gehen von folgender Beispieltabelle aus:
Beispiel 1: Gesamtmenge Pro Kunde
Frage: Wie viele Artikel hat jeder Kunde insgesamt bestellt?
Wir gruppieren nach Kunden:
Und wenden dann die SUM() Funktion pro Gruppe auf die Spalte menge
an:
SELECT
kunde,
SUM(menge) AS Anzahl_Artikel
FROM bestellungen
GROUP BY kunde;
+---------+----------------+
| kunde | Anzahl_Artikel |
+---------+----------------+
| Anna | 13 |
| Bernd | 5 |
| Claudia | 7 |
| Hannes | 10 |
+---------+----------------+
4 rows in set (0,001 sec)
bestell_id
, produkt
und preis
in diesem Kontext
(wie viel wurde pro Kunde bestellt) nicht sinnvoll aggregiert werden können und in der Abfrage auch nicht selektiert
werden sollten. Syntaktisch geht das, aber das Ergebnis ergibt dann keinen Sinn.
Beispiel 2: Anzahl der Bestellungen pro Produkt
Frage: Wie viele Bestellungen gibt es pro Produkt?
Wir gruppieren nach Produkten:
Und zählen die Zeilen pro Gruppe:
SELECT
produkt,
COUNT(*) AS AnzahlBestellungen
FROM bestellungen
GROUP BY produkt;
+---------+--------------------+
| produkt | AnzahlBestellungen |
+---------+--------------------+
| Apfel | 3 |
| Banane | 2 |
| Gurke | 1 |
+---------+--------------------+
3 rows in set (0,001 sec)
Beispiel 3: Durchschnittliche Bestellmenge pro Produkt
Frage: Wie ist die durchschnittliche Bestellmenge pro Produkt?
Wir gruppieren nach Produkten:
SELECT
produkt,
AVG(menge) AS AVG_Bestellmenge
FROM bestellungen
GROUP BY produkt;
+---------+------------------+
| produkt | AVG_Bestellmenge |
+---------+------------------+
| Apfel | 7.6667 |
| Banane | 5.0000 |
| Gurke | 2.0000 |
+---------+------------------+