Zurück zur Artikelliste Artikel
9 Leseminuten

5 Beispiele für GROUP BY

Wenn Sie anfangen, SQL zu lernen, stoßen Sie schnell auf die GROUP BY-Klausel. Die Datengruppierung - oder Datenaggregation - ist ein wichtiges Konzept in der Welt der Datenbanken. In diesem Artikel zeigen wir Ihnen, wie Sie die GROUP BY-Klausel in der Praxis einsetzen können. Wir haben fünf GROUP BY-Beispiele zusammengestellt, von einfachen bis zu komplexen, damit Sie die Datengruppierung in einem realen Szenario sehen können. Als Bonus erfahren Sie auch etwas über Aggregatfunktionen und die HAVING-Klausel.

SQL ist eine universelle Sprache für die Kommunikation mit Datenbanken, die es schon seit fast 50 Jahren gibt. Wenn Sie ein absoluter Anfänger sind, sollten Sie unseren SQL für Anfänger besuchen, bevor Sie diesen Artikel lesen.

Eines der wichtigsten Konzepte hinter SQL ist die Datengruppierung oder Datenaggregation. Wenn Sie diesen Artikel lesen, haben Sie wahrscheinlich schon von der GROUP BY Klausel gehört. Damit Sie sie besser verstehen, haben wir fünf Geschäftsprobleme vorgestellt und gezeigt, wie sie in unseren GROUP BY Beispielen gelöst werden können.

Wenn Sie eine kurze Einführung in GROUP BY benötigen, sehen Sie sich unser fünfminütiges YouTube-Video an.

In diesem Artikel werden wir einem imaginären Museum helfen, seine Gäste zu analysieren. Wir werden die Historie der Museumsbesuche nutzen, um mithilfe der GROUP BY Klausel aussagekräftige Erkenntnisse zu gewinnen. Dann nichts wie ran an die Arbeit!

Eingabedaten

Wir werden mit einer einzigen Tabelle namens visit. Jede Zeile steht für einen einzelnen Besuch im Museum. Unten sehen Sie ein paar Beispielzeilen aus dieser Tabelle:

visit

datepriceduration
2020-05-01215
2020-05-01437
2020-05-06724
...

Wie Sie sehen können, ist die Tabelle nicht sehr kompliziert. Sie enthält nur drei Spalten:

  • Datum - DasDatum des Museumsbesuchs.
  • Preis - Derfür die Eintrittskarte gezahlte Preis in Dollar (Sie werden eine Vielzahl von Preisen sehen, da das Museum an verschiedenen Tagen unterschiedliche Preisoptionen und viele Arten von ermäßigten Eintrittskarten verwendet).
  • Dauer - DieDauer des Museumsbesuchs in Minuten.

Übrigens: Wenn Sie bereits mit den grundlegenden SQL-Anweisungen vertraut sind und stattdessen das Erstellen von Tabellen ausprobieren möchten, schauen Sie sich den Die Grundlagen der Tabellenerstellung in SQL an.

Warum gruppieren wir Zeilen?

Wir wissen, dass wir in SQL Zeilen aggregieren (gruppieren) können, aber warum tun wir das? Die GROUP BY Klausel wird normalerweise zusammen mit Aggregatfunktionen verwendet, die verschiedene Statistiken über die Gruppen von Zeilen berechnen. Die fünf grundlegenden Aggregatfunktionen in SQL sind:

  • COUNT()-Zum Zählen der Anzahl der Zeilen.
  • AVG()-Zur Ermittlung des Durchschnittswerts.
  • MIN() und MAX()- Zum Ermitteln des Mindest- bzw. Höchstwerts.
  • SUM()-Zur Ermittlung der Summe aller Werte.

Kurz gesagt, wir gruppieren Zeilen, um verschiedene Statistiken zu berechnen.

GROUP BY Beispiele

Gut. Da wir nun ein wenig über Aggregatfunktionen wissen, sehen wir uns fünf GROUP BY-Beispiele an.

Beispiel 1: GROUP BY mit einer Spalte

Wir beginnen mit einem einfachen Beispiel. Wir wollen herausfinden, wie viele Personen das Museum an jedem Tag besucht haben. Mit anderen Worten, wir wollen für jedes Datum die Anzahl der Museumsbesucher anzeigen. Die Abfrage, die wir benötigen, sieht wie folgt aus:

SELECT date, COUNT(*)
FROM visit
GROUP BY date;

Wir haben nur zwei Spalten: Datum und Anzahl. COUNT(*) bedeutet "alles zählen". Da wir auch die Datumsspalte in der GROUP BY-Klausel verwenden, wird für jedes Datum eine eigene Zählung angezeigt. Wenn wir die Abfrage in unserer Datenbank ausführen, sollten wir etwas wie dieses sehen:

datecount
2020-06-297
2020-05-236
2020-06-235
...

Ausgezeichnet. Wir wissen jetzt, wie viele Personen das Museum an jedem Tag besucht haben.

Anstelle von COUNT(*), was "jede Zeile zählen" bedeutet, könnten wir auch einen Spaltennamen verwenden, z. B. COUNT(duration). Der Unterschied ist, dass COUNT(*) alle Zeilen für eine bestimmte Gruppe zählt, auch wenn einige Zeilen NULL (unbekannte) Werte enthalten. COUNT(duration) Im Gegensatz dazu zählt duration nur die Zeilen, die einen Nicht-NULL-Wert in der Spalte enthalten. In unserer Tabelle gibt es jedoch keine NULL-Werte, so dass das Ergebnis das gleiche wäre.

Beispiel 2: GROUP BY mit zwei Spalten

Wir wollen nun den durchschnittlichen Preis wissen, der in einem bestimmten Monat für ein Ticket bezahlt wurde. Dazu benötigen wir eine kompliziertere Abfrage. Schauen Sie sich das an:

SELECT 
  EXTRACT(YEAR FROM date) AS year, 
  EXTRACT(MONTH FROM date) AS month, 
  ROUND(AVG(price), 2) AS avg_price
FROM visit
GROUP BY
  EXTRACT(YEAR FROM date),
  EXTRACT(MONTH FROM date);

Wir haben die Funktion EXTRACT(YEAR FROM date) verwendet, um das Jahr aus jedem Datum zu erhalten, und wir haben EXTRACT(MONTH FROM date) verwendet, um den Monat zu erhalten (als numerischen Wert, wobei "1" für "Januar", "2" für "Februar" usw. steht). Beachten Sie, dass sie als separate Spalten behandelt werden, so dass Sie das Jahr in einer Spalte und den Monat in einer anderen Spalte sehen werden.

Da wir den Durchschnitt für jeden Monat eines jeden Jahres separat anzeigen wollen, müssen wir auch nach diesen beiden Spalten gruppieren. Wir müssen die gleichen Funktionen in der GROUP BY Klausel wiederholen.

Die dritte Spalte ist eine Kombination aus zwei Funktionen. Darin befindet sich AVG(price), die den Durchschnittspreis in jeder Gruppe berechnet. Außerdem haben wir ROUND(AVG(price), 2)), um den Durchschnittswert auf zwei Dezimalstellen zu runden.

Wenn Sie eine GROUP BY Klausel verwenden, sollten Sie sich an die goldene Regel halten: Alle Spaltennamen aus der SELECT Klausel sollten entweder in der GROUP BY Klausel erscheinen oder in den Aggregatfunktionen verwendet werden. In diesem Fall sollten sowohl EXTRACT(YEAR FROM date) als auch EXTRACT(MONTH FROM date) in der Klausel GROUP BY erscheinen. Wenn Sie einen von ihnen vergessen, wird wahrscheinlich ein Fehler angezeigt. Die dritte Spalte verwendet eine Aggregatfunktion, AVG(price), und wird daher nicht in der Klausel GROUP BY erwähnt.
Es gibt einige Ausnahmen von dieser Regel, die zu unerwartetem Verhalten führen können.

Wenn wir die Abfrage ausführen, sehen wir etwa so aus:

yearmonthavg_price
202057.52
202066.70

Wie Sie sehen können, ist der durchschnittliche Ticketpreis im Juni im Vergleich zum Mai gesunken. Dies könnte sich in geringeren Einnahmen für das Museum niederschlagen.

Beispiel 3: GROUP BY und ORDER BY

Diesmal möchten wir den Durchschnittswert der Besuchsdauer für jeden Monat ermitteln. Außerdem wollen wir sicherstellen, dass die Zeilen chronologisch sortiert sind. Die Abfrage, die wir benötigen, ist ähnlich wie im vorherigen Beispiel:

SELECT 
  EXTRACT(YEAR FROM date) AS year, 
  EXTRACT(MONTH FROM date) AS month, 
  ROUND(AVG(duration), 2)
FROM visit
GROUP BY 
  EXTRACT(YEAR FROM date), 
  EXTRACT(MONTH FROM date)
ORDER BY 
  EXTRACT(YEAR FROM date), 
  EXTRACT(MONTH FROM date);

Neu ist hier die ORDER BY -Klausel. Mit einer ORDER BY -Klausel können wir die Reihenfolge angeben, in der wir die Zeilen sehen wollen. In diesem Fall möchten wir alle Zeilen zuerst nach dem Jahr und dann nach dem Monat sortiert sehen.

Auch hier müssen wir die gleichen Funktionen wie in der SELECT -Klausel wiederholen, damit die ORDER BY -Klausel funktioniert. Standardmäßig sortiert ORDER BY die Zeilen in aufsteigender Reihenfolge.

Wenn Sie die Zeilen in absteigender Reihenfolge sehen wollen, müssen Sie das Schlüsselwort DESC nach dem Spaltennamen hinzufügen. Schreiben Sie zum Beispiel ORDER BY EXTRACT(YEAR FROM date) DESC. Mehr über den Unterschied zwischen GROUP BY und ORDER BY erfahren Sie in diesem Artikel.

Wenn wir die Abfrage ausführen, sehen wir etwa so aus:

yearmonthavg_duration
2020547.61
2020651.33

Im Durchschnitt verbrachte ein Gast im Juni mehr Zeit im Museum als im Mai. Das ist eine gute Nachricht!

Beispiel 4: GROUP BY und HAVING

Nun haben wir folgendes Problem: Wir möchten den durchschnittlichen Eintrittspreis für jeden Tag sehen. Es gibt jedoch eine zusätzliche Bedingung: Wir wollen keine Tage mit 3 oder weniger Besuchen anzeigen. Diese Bedingung führt zu einem neuen Teil in unserer SQL-Abfrage. Schauen Sie sich das an:

SELECT 
  date, 
  ROUND(AVG(price), 2) AS avg_price
FROM visit
GROUP BY date
HAVING COUNT(*) > 3
ORDER BY date;

Der neue Teil hier ist HAVING COUNT(*) > 3. HAVING ist eine Klausel, mit der wir die gruppierten Zeilen filtern können. In diesem Fall gruppieren wir die Zeilen nach dem Datum (GROUP BY date). Dabei wollen wir sicherstellen, dass eine bestimmte Gruppe mehr als drei Zeilen enthält (HAVING COUNT(*) > 3). Wenn eine Gruppe (in diesem Fall die Besuche an einem bestimmten Tag) diese Bedingung nicht erfüllt, wird sie gar nicht erst angezeigt.

Wenn wir die Abfrage ausführen, sehen wir etwa so aus:

dateavg_price
2020-05-015.80
2020-05-157.00
2020-05-236.67
...

Beispiel 5: GROUP BY, HAVING und WHERE

Schließlich haben wir noch das folgende Problem zu lösen: Wir möchten die durchschnittliche Besuchsdauer für jeden Tag anzeigen. Auch hier wollen wir nur die Tage mit mehr als drei Besuchen anzeigen. Wir wollen aber auch sicherstellen, dass Besuche, die fünf Minuten oder kürzer sind, nicht in die Berechnungen einbezogen werden. Dabei handelt es sich höchstwahrscheinlich um Tests, die von den Museumsmitarbeitern durchgeführt werden, so dass wir sie ignorieren wollen. Dies ist die Abfrage, die wir benötigen:

SELECT 
  date, 
  ROUND(AVG(duration), 2) AS avg_duration
FROM visit
WHERE duration > 5
GROUP BY date
HAVING COUNT(*) > 3
ORDER BY date;

Der neue Teil hier ist die WHERE Klausel. Sie wird verwendet, um nur Besuche einzuschließen, die länger als fünf Minuten gedauert haben.

Die Klauseln WHERE und HAVING sehen vielleicht ähnlich aus, aber es gibt einen Unterschied zwischen ihnen: WHERE wird verwendet, um einzelne Zeilen zu filtern, bevor sie gruppiert werden (d. h. einzelne Besuche), während HAVING verwendet wird, um Gruppen von Zeilen zu filtern (d. h. Besuche an einem bestimmten Tag). Lesen Sie mehr in diesem Artikel.

Wenn wir die Abfrage ausführen, sehen wir etwa so aus:

dateavg_duration
2020-05-0129.80
2020-05-1555.75
2020-05-2332.17
2020-05-2969.50
2020-06-0239.83
2020-06-0448.67
2020-06-0948.50
2020-06-2351.60
2020-06-2957.86

Beachten Sie, wie die durchschnittliche Besuchsdauer mit fast jedem Tag im Juni zunimmt. Es sieht so aus, als hätten wir eine interessante Ausstellung hinzugefügt und unsere Gäste haben sie bekannt gemacht.

Zusammenfassung und Nachbereitung

Mit diesen fünf Beispielen sind wir von einfachen zu komplexeren GROUP BY Fällen übergegangen. Die Vielseitigkeit von SQL ermöglichte es uns, die Museumsbesuche zu analysieren und mehrere Fragen dazu zu beantworten. Dies zeigt, wie effektiv GROUP BY echte Geschäftsprobleme lösen kann.

Wenn Sie mehr über die GROUP BY-Klausel lesen möchten, hat unsere Chefredakteurin Agnieszka einen umfassenden Artikel verfasst, den Sie hier finden.

Wenn Sie Lust haben, mehr SQL zu lernen, schauen Sie doch mal unter LearnSQL.de. Das Team von LearnSQL.de lehrt SQL von Grund auf auf interaktive Weise.

Für Anfänger haben wir unseren meistverkauften SQL für Anfänger. Wir garantieren einen reibungslosen Einstieg in die Welt des Programmierens für Menschen ohne IT-Vorkenntnisse. Sie müssen sich nicht um die technische Einrichtung kümmern - Sie lernen direkt von Ihrem Webbrowser aus. Wir kümmern uns um die Datenbank, während Sie sich auf die Schlüsselkonzepte von SQL konzentrieren.

Wenn Sie mehr über die Vorteile des Lernens mit uns wissen möchten, bevor Sie ein Abonnement erwerben, lesen Sie unseren Artikel: Warum der SQL für Anfänger Kurs bei LearnSQL.com. Dieser Artikel erklärt im Detail, warum wir den Kurs entwickelt haben, was er beinhaltet und welche Philosophie dahinter steckt.