Aggregatfunktionen: SUM, COUNT, AVG & Co. im Vergleich

Aggregatfunktionen sind spezielle SQL-Funktionen, die aus einer Menge von Werten einen einzigen Ergebniswert berechnen. Sie helfen dir, große Datenmengen auf einen Blick zusammenzufassen, auszuwerten und aussagekräftige Berichte zu erstellen. Typische Beispiele sind das Berechnen von Summen, Durchschnittswerten oder das Zählen von Einträgen.

Wozu dienen Aggregatfunktionen?

  • Zusammenfassung großer Datensätze, ohne jede Zeile einzeln betrachten zu müssen.
  • Erstellung von Statistiken und Berichten, z. B. Umsatzberichte oder Nutzeraktivitäten.
  • Datenanalyse, um Muster, Trends oder Ausreißer schnell zu erkennen.

Praxisbeispiel: Stell dir vor, du betreibst einen Online-Shop. Jeden Tag werden zahlreiche Bestellungen getätigt. Mit Aggregatfunktionen kannst du zum Beispiel den Gesamtumsatz eines Monats berechnen, die durchschnittliche Bestellgröße ermitteln oder herausfinden, wie viele unterschiedliche Produkte verkauft wurden – alles ohne jede Bestellung einzeln zu prüfen.

SQL Aggregatfunktionen

Grundlagen von Aggregatfunktionen

Aggregatfunktionen in SQL verarbeiten mehrere Zeilen einer Tabelle und liefern daraus einen einzigen Ergebniswert. Sie fassen Daten zusammen, anstatt jede einzelne Zeile zu betrachten. So kannst du schnell aussagekräftige Informationen gewinnen.

Wie Aggregatfunktionen in SQL arbeiten:

  • Sie nehmen eine oder mehrere Spalten als Eingabe.
  • Verarbeiten die Werte dieser Spalten über alle relevanten Zeilen.
  • Geben einen einzelnen Wert zurück, z. B. eine Summe, einen Durchschnitt oder eine Anzahl.

Wichtige Syntaxregeln:

  • Kombination mit GROUP BY: Gruppiere Daten, um Aggregatfunktionen auf bestimmte Teilmengen anzuwenden. Beispiel: SELECT kategorie, SUM(umsatz) FROM Verkäufe GROUP BY kategorie;
  • Verwendung von DISTINCT: Mit DISTINCT kannst du Duplikate ausschließen. Beispiel: SELECT COUNT(DISTINCT produkt) FROM Verkäufe;
  • Behandlung von NULL-Werten:
    • COUNT(*) zählt alle Zeilen, auch wenn Werte NULL sind.
    • COUNT(spalte) ignoriert NULL-Werte.

Die Kernfunktionen im Detail

In SQL gibt es mehrere wichtige Aggregatfunktionen, die dir helfen, Daten zusammenzufassen. Im Folgenden werden die häufigsten Funktionen anhand einer Beispiel-Tabelle Verkäufe (Spalten: id, produkt, umsatz, datum, kategorie) erklärt. Dabei zeigen wir auch, wie jede Funktion in der Praxis genutzt wird.

SUM()

Einsatz: Berechnung von Gesamtsummen, z. B. Gesamtumsatz oder Gesamtmenge eines Produkts.

Beispiel:

SELECT SUM(umsatz) FROM Verkäufe;

Hier werden alle Werte in der Spalte umsatz addiert. Angenommen, du hast fünf Verkäufe mit Umsätzen von 100, 200, 150, 300 und 270. Das Ergebnis von SUM(umsatz) wäre 1020. SUM() ignoriert automatisch NULL-Werte, sodass fehlende Umsätze die Berechnung nicht verfälschen.

COUNT()

Einsatz: Zählen von Zeilen oder eindeutigen Werten. COUNT ist besonders nützlich, um zu wissen, wie viele Einträge es gibt oder wie viele unterschiedliche Produkte verkauft wurden.

  • COUNT(*) zählt jede Zeile in der Tabelle, unabhängig davon, ob Spalten NULL enthalten. Beispiel: Anzahl aller Verkäufe.
  • COUNT(spalte) zählt nur Zeilen, in denen die angegebene Spalte nicht NULL ist. Beispiel: COUNT(umsatz) zählt nur Verkäufe, bei denen ein Umsatz eingetragen ist.
  • COUNT(DISTINCT spalte) zählt nur eindeutige Werte in der Spalte. Beispiel: COUNT(DISTINCT produkt) gibt die Anzahl verschiedener Produkte zurück, die verkauft wurden.

Beispiel:

SELECT COUNT(DISTINCT produkt) FROM Verkäufe;

Wenn du drei verschiedene Produkte verkauft hast, z. B. „T-Shirt“, „Hose“ und „Jacke“, liefert die Abfrage den Wert 3, selbst wenn ein Produkt mehrfach verkauft wurde.

AVG()

Einsatz: Berechnung des Durchschnittswerts, z. B. Durchschnittsumsatz pro Bestellung. AVG() addiert alle Werte und teilt durch die Anzahl der nicht-NULL-Werte.

Beispiel:

SELECT AVG(umsatz) FROM Verkäufe;

Angenommen, die Umsätze der Verkäufe sind 100, 200, 150, 300 und 270. Die Summe beträgt 1020, und es gibt 5 Werte. Der Durchschnitt wäre 1020 ÷ 5 = 204. Wenn eine Zeile NULL für umsatz enthält, wird diese Zeile bei der Berechnung ignoriert, sodass das Ergebnis nicht verzerrt wird.

MIN() / MAX()

Einsatz: Ermittlung der kleinsten oder größten Werte, z. B. das früheste oder späteste Verkaufsdatum oder die niedrigste und höchste Bestellung.

Beispiel:

SELECT MIN(datum), MAX(datum) FROM Verkäufe;

MIN() gibt das früheste Datum zurück, z. B. 2025-01-03, MAX() das späteste Datum, z. B. 2025-07-21. Diese Funktionen sind sehr hilfreich, um Zeiträume oder Limits zu analysieren.

Bonusfunktionen

Einige SQL-Dialekte bieten Aggregatfunktionen für Textwerte, um mehrere Einträge zu einer Zeichenkette zusammenzuführen:

  • GROUP_CONCAT() (MySQL) – Verkettet Textwerte innerhalb einer Gruppe, z. B. alle Produktnamen eines Monats.
  • STRING_AGG() (PostgreSQL, SQL Server) – Ähnlich wie GROUP_CONCAT, verbindet mehrere Textwerte zu einer einzigen Zeichenkette.

Beispiel MySQL:

SELECT kategorie, GROUP_CONCAT(produkt) FROM Verkäufe GROUP BY kategorie;

Das Ergebnis könnte sein: Kategorie „Bekleidung“ → „T-Shirt,Hose,Jacke“.

Vergleichstabelle

Die folgende Tabelle gibt dir einen schnellen Überblick über die wichtigsten Aggregatfunktionen in SQL, ihre Einsatzgebiete, wie sie mit NULL-Werten umgehen, ob DISTINCT verwendet werden kann und ein typisches Beispielergebnis:

Funktion Einsatzgebiet Behandlung von NULL Mit DISTINCT? Beispieloutput
SUM() Summenbildung NULL-Werte werden ignoriert Ja 1520.00
COUNT() Zeilen- oder Wertezählung Teilweise ignoriert* (COUNT(*) zählt alle Zeilen, COUNT(spalte) ignoriert NULL) Ja 42
AVG() Durchschnittsberechnung NULL-Werte werden ignoriert Ja 37.14
MIN() Kleinster Wert NULL-Werte werden ignoriert Nein 10.00
MAX() Größter Wert NULL-Werte werden ignoriert Nein 99.99

*Hinweis: COUNT(*) zählt wirklich jede Zeile, auch wenn Spalten NULL enthalten. COUNT(spalte) ignoriert dagegen Zeilen, in denen die Spalte NULL ist. COUNT(DISTINCT spalte) zählt nur eindeutige, nicht-NULL-Werte.

Praxis-Szenarien mit GROUP BY

Die GROUP BY-Klausel wird verwendet, um Datensätze in Gruppen zusammenzufassen, bevor Aggregatfunktionen angewendet werden. So lassen sich z. B. monatliche Umsätze oder durchschnittliche Werte pro Kategorie berechnen.

Beispiel 1: Monatliche Umsätze berechnen

SELECT MONTH(datum) AS Monat, SUM(umsatz) AS Gesamtumsatz 
FROM Verkäufe 
GROUP BY Monat;

Erklärung:

  • MONTH(datum) extrahiert den Monat aus der Spalte datum.
  • SUM(umsatz) addiert alle Umsätze innerhalb dieses Monats.
  • GROUP BY Monat sorgt dafür, dass die SUM()-Funktion für jeden Monat separat berechnet wird.

Das Ergebnis könnte eine Tabelle sein, die für jeden Monat den Gesamtumsatz zeigt, z. B. Januar: 5000, Februar: 7200, usw.

Beispiel 2: Durchschnittlicher Umsatz pro Produktkategorie

SELECT kategorie, AVG(umsatz) AS Durchschnitt 
FROM Verkäufe 
GROUP BY kategorie;

Erklärung:

  • Hier wird die Tabelle nach der Spalte kategorie gruppiert.
  • Für jede Kategorie wird der Durchschnitt der Umsätze berechnet.
  • NULL-Werte in umsatz werden bei der Berechnung von AVG() automatisch ignoriert.

Beispielergebnis:

Kategorie Durchschnittlicher Umsatz
Bekleidung 210.50
Elektronik 560.75
Haushalt 320.00

Häufige Fehler bei GROUP BY

  • Vergessen der GROUP BY-Klausel, wenn Aggregatfunktionen zusammen mit anderen Spalten verwendet werden.
  • Falsche Spalten in SELECT, die nicht gruppiert oder aggregiert werden. SQL gibt dann einen Fehler.
  • Unbedachtes Einbeziehen von NULL-Werten – bei COUNT(spalte) werden diese ignoriert, bei SUM() oder AVG() können sie das Ergebnis beeinflussen, wenn die Werte fehlen.

Fortgeschrittene Techniken

Neben den grundlegenden Aggregatfunktionen gibt es fortgeschrittene Methoden, um Daten noch gezielter auszuwerten. Dazu gehören Filterung aggregierter Ergebnisse, verschachtelte Aggregationen und die Kombination mehrerer Funktionen in einer Abfrage.

Filterung mit HAVING (vs. WHERE)

Die WHERE-Klausel filtert Zeilen vor der Aggregation, HAVING filtert Ergebnisse nach der Aggregation. Das ist besonders wichtig, wenn du nur Gruppen anzeigen willst, die bestimmte Bedingungen erfüllen.

SELECT kategorie, AVG(umsatz) AS Durchschnitt 
FROM Verkäufe 
GROUP BY kategorie 
HAVING AVG(umsatz) > 100;

Erklärung:

  • GROUP BY kategorie gruppiert die Verkäufe nach Kategorie.
  • AVG(umsatz) berechnet den Durchschnittsumsatz jeder Kategorie.
  • HAVING AVG(umsatz) > 100 filtert nur die Kategorien, deren Durchschnittsumsatz größer als 100 ist.

Verschachtelte Aggregationen

Manchmal willst du nicht nur einfache Aggregationen, sondern z. B. die maximale Summe aus mehreren Gruppen herausfinden. Hierbei kommen Subqueries (Unterabfragen) zum Einsatz:

SELECT MAX(Summe) AS MaxUmsatz
FROM (
    SELECT kategorie, SUM(umsatz) AS Summe
    FROM Verkäufe
    GROUP BY kategorie
) AS KategorieSumme;

Erklärung:

  • Die innere Abfrage berechnet die Summe des Umsatzes pro Kategorie.
  • Die äußere Abfrage ermittelt den höchsten Wert dieser Summen.
  • So kannst du z. B. herausfinden, welche Kategorie den höchsten Gesamtumsatz erzielt hat.

Kombination mehrerer Funktionen

In einer Abfrage lassen sich mehrere Aggregatfunktionen gleichzeitig nutzen, um umfassendere Analysen zu erstellen:

SELECT kategorie, 
       COUNT(*) AS AnzahlVerkäufe, 
       SUM(umsatz) AS Gesamtumsatz, 
       AVG(umsatz) AS DurchschnittUmsatz,
       MIN(umsatz) AS MinimalerUmsatz,
       MAX(umsatz) AS MaximalerUmsatz
FROM Verkäufe
GROUP BY kategorie;

Erklärung:

  • Die Tabelle wird nach kategorie gruppiert.
  • Für jede Kategorie werden Anzahl, Summe, Durchschnitt, Minimum und Maximum berechnet.
  • Das Ergebnis liefert eine kompakte Übersicht pro Kategorie, ohne mehrere Abfragen ausführen zu müssen.

Performance-Tipps

Aggregatfunktionen und GROUP BY können bei großen Datensätzen schnell zu Performance-Problemen führen. Mit einigen Strategien kannst du deine Abfragen deutlich beschleunigen:

1. Indizierung von Gruppierungsspalten

Wenn du eine Spalte für GROUP BY verwendest, kann ein Index auf dieser Spalte die Gruppierung erheblich beschleunigen, besonders bei großen Tabellen.

CREATE INDEX idx_kategorie ON Verkäufe(kategorie);

Dieser Index hilft der Datenbank, die Daten schneller zu gruppieren.

2. DISTINCT bei großen Datensätzen vermeiden

Die Verwendung von DISTINCT kann bei großen Tabellen sehr rechenintensiv sein. Prüfe, ob du Alternativen nutzen kannst, z. B.:

  • Aggregationen auf eindeutige Werte in einer vorherigen Unterabfrage.
  • Materialisierte Views, wenn die Daten häufig abgefragt werden.

3. Nutzung von EXPLAIN-Plänen

Mit EXPLAIN kannst du analysieren, wie die Datenbank deine Abfrage ausführt und Engpässe erkennen:

EXPLAIN SELECT kategorie, SUM(umsatz) 
FROM Verkäufe 
GROUP BY kategorie;

Erklärung:

  • Du siehst, welche Indizes genutzt werden, wie viele Zeilen verarbeitet werden und welche Schritte am meisten Zeit kosten.
  • So kannst du gezielt Optimierungen durchführen, z. B. zusätzliche Indizes anlegen oder unnötige Berechnungen vermeiden.

4. Allgemeine Tipps

  • Aggregationen nur auf die notwendigen Spalten anwenden.
  • Subqueries nur verwenden, wenn es wirklich nötig ist, da sie zusätzliche Rechenzeit kosten.
  • Bei häufigen Abfragen über große Datenmengen über Materialized Views oder temporäre Tabellen nachdenken.

Zusammenfassung & Entscheidungshilfe

Aggregatfunktionen sind das Herzstück der Datenanalyse in SQL. Sie ermöglichen es, große Datenmengen zusammenzufassen und wertvolle Einblicke zu gewinnen. Hier ein kompakter Leitfaden, wann du welche Funktion einsetzen solltest:

  • Gesamtsumme → SUM()
    Verwende SUM(), wenn du die Gesamtmenge einer Zahlenspalte berechnen willst, z. B. den gesamten Umsatz eines Monats.
  • Anzahl / Deduplizierung → COUNT(DISTINCT …)
    COUNT(*) zählt alle Zeilen, COUNT(spalte) zählt nur nicht-NULL-Werte und COUNT(DISTINCT spalte) liefert die Anzahl eindeutiger Werte.
  • Mittelwert → AVG()
    AVG() berechnet den Durchschnitt. Achte darauf, dass NULL-Werte ignoriert werden und die Berechnung nur auf vorhandene Werte erfolgt.
  • Extremwerte → MIN() / MAX()
    Diese Funktionen liefern den kleinsten oder größten Wert in einer Spalte. Sie eignen sich für Zeitreihen, Limits oder Vergleichswerte.

Wann GROUP BY und HAVING notwendig sind

Wenn du Werte nach Gruppen aggregieren willst, brauchst du GROUP BY. Möchtest du anschließend nur bestimmte Gruppen ausgeben (z. B. Kategorien mit hohem Umsatz), nutzt du HAVING:

SELECT kategorie, SUM(umsatz) AS Gesamtumsatz
FROM Verkäufe
GROUP BY kategorie
HAVING SUM(umsatz) > 1000;

Erklärung:

  • Die Abfrage gruppiert Verkäufe nach Kategorie.
  • Es wird die Gesamtsumme pro Kategorie berechnet.
  • Mit HAVING werden nur die Kategorien angezeigt, deren Gesamtumsatz größer als 1000 ist.

Mit diesem Wissen kannst du die richtigen Aggregatfunktionen gezielt einsetzen, Abfragen performant gestalten und die Ergebnisse zuverlässig interpretieren.