Site x5

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.:

Syntax von GROUP BY

SELECT spalte1, AGGREGATFUNKTION(spalte2)
FROM tabelle
GROUP BY spalte1;

Dabei ist Aggregatfunktion eine von den 5 Aggregatfunktionen

Datenwolke

GROUP BY
GROUP BY

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:

Bestellungen
bestell_id
bestell_id
kunde
kunde
produkt
produkt
menge
menge
preis
preis
1
1
Anna
Anna
Apfel
Apfel
10
10
0.5
0.5
2
2
Bernd
Bernd
Apfel
Apfel
5
5
0.5
0.5
3
3
Claudia
Claudia
Banane
Banane
7
7
0.3
0.3
4
4
Anna
Anna
Banane
Banane
3
3
0.3
0.3
5
5
Hannes
Hannes
Gurke
Gurke
2
2
0.7
0.7
6
6
Hannes
Hannes
Apfel
Apfel
8
8
0.5
0.5

Beispiel 1: Gesamtmenge Pro Kunde

Frage: Wie viele Artikel hat jeder Kunde insgesamt bestellt?

Wir gruppieren nach Kunden:

Bestellungen
bestell_id
bestell_id
kunde
kunde
produkt
produkt
menge
menge
preis
preis
1
1
Anna
Anna
Apfel
Apfel
10
10
0.5
0.5
2
2
Bernd
Bernd
Apfel
Apfel
5
5
0.5
0.5
3
3
Claudia
Claudia
Banane
Banane
7
7
0.3
0.3
4
4
Anna
Anna
Banane
Banane
3
3
0.3
0.3
5
5
Hannes
Hannes
Gurke
Gurke
2
2
0.7
0.7
6
6
Hannes
Hannes
Apfel
Apfel
8
8
0.5
0.5
Bestellungen
bestell_id
bestell_id
kunde
kunde
produkt
produkt
menge
menge
preis
preis
1
1
Anna
Anna
Apfel
Apfel
10
10
0.5
0.5
4
4
Anna
Anna
Banane
Banane
3
3
0.3
0.3
2
2
Bernd
Bernd
Apfel
Apfel
5
5
0.5
0.5
3
3
Claudia
Claudia
Banane
Banane
7
7
0.3
0.3
5
5
Hannes
Hannes
Gurke
Gurke
2
2
0.7
0.7
6
6
Hannes
Hannes
Apfel
Apfel
8
8
0.5
0.5
SUM()
SUM()

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)

Bestellungen
bestell_id
bestell_id
kunde
kunde
produkt
produkt
menge
menge
preis
preis
???
???
Anna
Anna
???
???
13
13
???
???
???
???
Bernd
Bernd
???
???
5
5
???
???
???
???
Claudia
Claudia
???
???
7
7
???
???
???
???
Hannes
Hannes
???
???
10
10
???
???

Beispiel 2: Anzahl der Bestellungen pro Produkt

Frage: Wie viele Bestellungen gibt es pro Produkt?

Wir gruppieren nach Produkten:

Bestellungen
bestell_id
bestell_id
kunde
kunde
produkt
produkt
menge
menge
preis
preis
1
1
Anna
Anna
Apfel
Apfel
10
10
0.5
0.5
2
2
Bernd
Bernd
Apfel
Apfel
5
5
0.5
0.5
6
6
Hannes
Hannes
Apfel
Apfel
8
8
0.5
0.5
3
3
Claudia
Claudia
Banane
Banane
7
7
0.3
0.3
4
4
Anna
Anna
Banane
Banane
3
3
0.3
0.3
5
5
Hannes
Hannes
Gurke
Gurke
2
2
0.7
0.7
Bestellungen
bestell_id
bestell_id
kunde
kunde
produkt
produkt
menge
menge
preis
preis
1
1
Anna
Anna
Apfel
Apfel
10
10
0.5
0.5
2
2
Bernd
Bernd
Apfel
Apfel
5
5
0.5
0.5
3
3
Claudia
Claudia
Banane
Banane
7
7
0.3
0.3
4
4
Anna
Anna
Banane
Banane
3
3
0.3
0.3
5
5
Hannes
Hannes
Gurke
Gurke
2
2
0.7
0.7
6
6
Hannes
Hannes
Apfel
Apfel
8
8
0.5
0.5
COUNT(*)
COUNT(*)
COUNT(*)
COUNT(*)
COUNT(*)
COUNT(*)

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 |
+---------+------------------+