Auswerten mit GROUP BY, COUNT und HAVING – Daten gruppieren und filtern
Wie viele Einträge pro Kategorie? Welche Kunden haben mehr als drei Bestellungen? Genau dafür sind GROUP BY und HAVING da. Ich zeige dir an einem kleinen Beispiel, wie du aus rohen Zeilen eine echte Auswertung machst.
Sobald du in einer Tabelle etwas zählen oder summieren willst, brauchst du GROUP BY. Statt jede Zeile einzeln anzusehen, fasst SQL sie in Gruppen zusammen und rechnet pro Gruppe. Ich erkläre es an einer Snippet-Tabelle – passend, weil ich sowas gerade selbst für eine Statistik-Auswertung nutze.
Zählen pro Kategorie
SELECT language, COUNT(*) AS anzahl
FROM snippets
GROUP BY language
ORDER BY anzahl DESC;GROUP BY language bildet je Sprache eine Gruppe, COUNT(*) zählt die Zeilen darin. ORDER BY anzahl DESC sortiert die größte Kategorie nach oben. Ergebnis: eine saubere „Sprache → Anzahl"-Liste.
Auch Summen gehen so
SELECT language, SUM(views) AS aufrufe
FROM snippets
GROUP BY language
ORDER BY aufrufe DESC;Statt zu zählen, summierst du hier die Aufrufe pro Sprache – so siehst du, welche Kategorie am meisten gelesen wird.
Gruppen filtern: HAVING statt WHERE
Ein häufiger Stolperstein: WHERE filtert einzelne Zeilen, bevor gruppiert wird. Willst du aber nach dem Ergebnis der Gruppe filtern (z. B. „nur Sprachen mit mehr als 5 Snippets"), brauchst du HAVING:
SELECT language, COUNT(*) AS anzahl
FROM snippets
GROUP BY language
HAVING COUNT(*) > 5
ORDER BY anzahl DESC;Merksatz: WHERE filtert Zeilen, HAVING filtert Gruppen. Beides lässt sich kombinieren – erst WHERE (z. B. nur veröffentlichte), dann GROUP BY, dann HAVING.
Genau solche Auswertungen baue ich regelmäßig in Admin-Bereiche ein, damit man auf einen Blick sieht, was läuft. Brauchst du sowas für dein Projekt? Schreib mir über bymw.de.
Quellen
Du brauchst mehr als ein Snippet?
Ich entwickle Android-Apps in Kotlin und moderne Websites für Selbstständige und kleine Unternehmen — von der ersten Idee bis zum Release.
Projekt anfragen →Verwandte Snippets
Laufende Summe in SQL – SUM() OVER statt Schleife in der Anwendung
Kontostand nach jeder Buchung, kumulierter Umsatz im Jahr, Restbestand nach jeder Entnahme: Alles dieselbe Frage. Mit einer Fensterfunktion beantwortet die Datenbank sie in einer Abfrage – inklusive gleitendem Durchschnitt.
Generierte Spalten in SQLite – abgeleitete Werte, die nie veralten
Bruttopreis, Suchspalte in Kleinschreibung, das Jahr aus einem Zeitstempel: Solche Werte doppelt zu pflegen ist eine Einladung an die Inkonsistenz. SQLite kann sie selbst berechnen – und sogar indizieren.
Trigger in SQLite – updated_at, das niemand vergessen kann
Ein Zeitstempel, den die Anwendung setzen muss, ist irgendwann falsch – spätestens beim Import, beim Admin-Skript oder beim schnellen UPDATE von Hand. Ein Trigger nimmt der Anwendung die Pflicht ab.