MB Dev .tech
Registrieren Login

SQL · GROUP BY & Aggregates

← Zurück zu SQL Basics

Mit GROUP BY und sogenannten Aggregatfunktionen kannst du Daten zusammenfassen und auswerten. Das ist extrem wichtig für Statistiken, Dashboards und Reports.

Merke
GROUP BY beantwortet „pro …“ Fragen

Zum Beispiel: „Wie viele Bestellungen pro Kunde?“ oder „Umsatz pro Tag?“

1) Was sind Aggregatfunktionen?

Aggregatfunktionen fassen mehrere Zeilen zu einem Wert zusammen. Die wichtigsten siehst du ständig:

  • COUNT() – zählt Zeilen
  • SUM() – addiert Werte
  • AVG() – berechnet den Durchschnitt
  • MIN() – kleinster Wert
  • MAX() – größter Wert
Beispiele

SELECT COUNT(*) FROM orders;
SELECT SUM(total_cents) FROM orders;
SELECT AVG(total_cents) FROM orders;
Tipp
COUNT(*) vs COUNT(spalte)

COUNT(*) zählt alle Zeilen. COUNT(spalte) zählt nur Zeilen, in denen diese Spalte nicht NULL ist.

2) Warum braucht man GROUP BY?

Ohne GROUP BY bekommst du eine Zahl für die ganze Tabelle. Mit GROUP BY teilst du die Tabelle in Gruppen auf – und berechnest pro Gruppe ein Ergebnis.

Beispiel-Frage: „Wie viele Bestellungen hat jeder Kunde?“

3) Beispiel-Tabelle: orders

orders (vereinfacht)

id | customer_id | total_cents
---+-------------+-------------
1  | 1           | 1999
2  | 1           | 3499
3  | 2           | 1299
4  | 3           | 4999

4) GROUP BY in Aktion

Wir gruppieren nach customer_id und zählen die Bestellungen:

COUNT pro Kunde

SELECT customer_id, COUNT(*) AS order_count
FROM orders
GROUP BY customer_id;

Ergebnis (gedanklich):


customer_id | order_count
------------+-------------
1           | 2
2           | 1
3           | 1
Merke
Alle Nicht-Aggregat-Spalten müssen im GROUP BY stehen

Wenn du etwas auswählst, das nicht gezählt/aufsummiert wird, muss es Teil der Gruppierung sein.

5) SUM & AVG – typische Auswertungen

Genauso einfach kannst du Umsätze oder Durchschnitte berechnen:

Umsatz pro Kunde

SELECT customer_id, SUM(total_cents) AS total_spent
FROM orders
GROUP BY customer_id;
Durchschnittlicher Bestellwert

SELECT AVG(total_cents) AS avg_order_value
FROM orders;

6) HAVING – Filter nach dem Gruppieren

WHERE filtert vor dem Gruppieren. HAVING filtert nach dem Gruppieren.

Beispiel: „Zeige nur Kunden mit mehr als einer Bestellung.“

HAVING Beispiel

SELECT customer_id, COUNT(*) AS order_count
FROM orders
GROUP BY customer_id
HAVING COUNT(*) > 1;
Achtung
HAVING ist kein Ersatz für WHERE

Nutze WHERE für normale Spalten und HAVING nur für Aggregat-Ergebnisse.

Wie geht es weiter?

Jetzt kannst du Daten zusammenfassen. Als Nächstes verbinden wir mehrere Tabellen miteinander – das ist der nächste große Schritt in SQL.

Nächster Schritt
JOINs & Relations

Damit holen wir uns z.B. Kundennamen zu Bestellungen dazu.