Zurück zur Artikelliste Artikel
10 Leseminuten

Wie man COUNT() mit GROUP BY verwendet: 5 praktische Beispiele

Die Verwendung der Funktion COUNT() mit GROUP BY ist eines der häufigsten SQL-Konstrukte in Aggregatabfragen. Lesen Sie diesen Artikel, um anhand von 5 Beispielen zu erfahren, wie Sie COUNT() mit GROUP BY richtig verwenden.

In diesem Artikel wird erklärt, wie wichtig die Verwendung von COUNT mit GROUP BY ist. Wir werden darüber sprechen, warum sie in SQL unverzichtbar ist und wie sie die Analyse und Zusammenfassung von Daten nach bestimmten Kriterien ermöglicht. Mit dieser Kombination können Benutzer aussagekräftige Erkenntnisse gewinnen, Zählungen berechnen und statistische Zusammenfassungen aus großen Datensätzen erstellen.

Wenn Sie eine gründliche Übersicht über die grundlegenden SQL-Konzepte wie COUNT() und GROUP BY suchen, empfehle ich Ihnen unseren interaktiven SQL für Anfänger Kurs. Er enthält 129 Übungen, mit denen Sie alle wichtigen SQL-Konzepte wiederholen können.

Wie man COUNT() und GROUP BY verwendet

Wenn Sie nur wegen der schnellen Antwort hier sind, hier ist die Kurzfassung:

Die korrekte Verwendung von COUNT() mit GROUP BY wird in der folgenden Abfrage gezeigt:

SELECT 
  Store,
  COUNT(*) as NumberOfSales, 
FROM Sales
GROUP BY Store;

Lassen Sie uns das Ergebnis aufschlüsseln, um zu verstehen, wie diese Abfrage funktioniert. Die Zeilen mit demselben Wert in der Spalte Store werden gruppiert. Stellen Sie sich eine Zwischentabelle vor, in der diese Zeilen gruppiert und mit verschiedenen Farben markiert sind, wie in der Abbildung unten. Dies wäre unsere Zwischentabelle, die nur die Spalte Store enthält, da dies die Spalte ist, die Teil unserer Anweisung SELECT ist.

StoreProductIDCustomerID
Store A1657
Store A11116
Store A14525
Store B1369
Store B11138
Store C13616
Store C1118

Die Datenbank zählt dann logischerweise die Anzahl der Zeilen in jeder Gruppe mit Hilfe der Funktion COUNT(*). Diese Zählung stellt die Anzahl der Bestellungen für jede Filiale dar.

Sobald die Zeilen gezählt sind, ist es nicht mehr nötig, doppelte Zeilen mit demselben Store-Wert zu haben. GROUP BY reduziert also die Anzahl der Zeilen auf eindeutige Werte. Mit anderen Worten, die einzelnen Zeilen werden entfernt und wir erhalten eine Zusammenfassung für jede Gruppe. Am Ende erhalten wir das folgende Ergebnis:

StoreNumberOfSales
Store A3
Store B2
Store C2

Wann wird GROUP BY verwendet?

GROUP BY ist eine SQL-Klausel, die Zeilen auf der Grundlage von einem oder mehreren Spaltenwerten gruppiert. Sie wird oft in Kombination mit Aggregatfunktionen wie COUNT(), SUM(), AVG(), MAX() und MIN() verwendet, um Berechnungen mit gruppierten Daten durchzuführen.

Die GROUP BY Klausel ist nützlich, wenn Sie:

  • Berechnungen und Aggregationen auf Teilmengen von Daten durchführen.
  • Zusammenfassende Statistiken und Metriken für verschiedene Gruppen oder Kategorien zu erstellen.
  • Muster und Trends innerhalb bestimmter Gruppen zu erkennen.
  • Berichte erstellen und Daten auf der Grundlage verschiedener Dimensionen oder Attribute analysieren möchten.
  • Anwendung von Filtern und Bedingungen auf gruppierte Daten unter Verwendung der HAVING

Zusammenfassend lässt sich sagen, dass GROUP BY verwendet wird, um Daten auf der Grundlage bestimmter Spalten, Funktionen oder Ausdrücke zu organisieren und zusammenzufassen, wodurch Sie Einblicke gewinnen und Berechnungen für bestimmte Gruppen innerhalb eines Datensatzes durchführen können.

Wann wird die Funktion COUNT() verwendet?

COUNT() ist eine der gebräuchlichsten Aggregatfunktionen von SQL. Sie gibt die Anzahl der Zeilen zurück, die einer bestimmten Bedingung entsprechen oder in einer Ergebnismenge enthalten sind. Sie wird häufig verwendet, um die Gesamtzahl der Datensätze in einer Tabelle abzurufen oder um die Anzahl der Vorkommen eines bestimmten Wertes in einer Spalte zu berechnen.

5 Beispiele für die Verwendung von COUNT() mit GROUP BY

Nachdem wir nun die grundlegenden Szenarien durchgespielt haben, in denen COUNT() und GROUP BY verwendet werden, wollen wir nun einige der komplizierteren Beispiele durchgehen. Wir beginnen mit einfacheren Beispielen und arbeiten uns dann zu komplexeren Szenarien vor.

Beispiel 1: GROUP BY einer einzelnen Spalte

Das einfachste Szenario ist, dass Sie nach einer einzelnen Spalte gruppieren müssen. Im folgenden Beispiel müssen wir herausfinden, wie sich die Anzahl der Mitarbeiter unseres Unternehmens auf die verschiedenen Berufsbezeichnungen verteilt.

Bevor wir uns die SQL-Lösung für dieses Szenario ansehen, gehen wir die Beispieldaten durch. Dies ist die employees Tabelle:

EmployeeIDFirstNameLastNameJobTitle
1JohnDoeManager
2JaneSmithSupervisor
3MarkJohnsonDeveloper
4EmilyWilliamsAnalyst
5MichaelBrownDesigner
6SarahDavisDeveloper
7RobertWilsonDesigner
8JessicaTaylorDeveloper

Durch die Verwendung der Funktion COUNT mit GROUP BY in der Spalte JobTitle können wir eine Aufschlüsselung der Anzahl der Mitarbeiter in jeder spezifischen Rolle erhalten. Sie können die Abfrage und die Ausgabe (basierend auf den Beispieldaten) unten sehen:

SELECT 
  JobTitle, 
  COUNT(*) AS NumberOfEmployees
FROM employees
GROUP BY JobTitle;
JobTitleNumberOfEmployees
Analyst1
Designer2
Developer3
Manager1
Supervisor1

Dieses Beispiel funktioniert auf die gleiche Weise wie unsere ursprüngliche Abfrage. GROUP BY fasst die Zeilen für Mitarbeiter mit der gleichen Berufsbezeichnung in einer Gruppe zusammen. Dann zählt die Funktion COUNT() die Zeilen in jeder Gruppe. GROUP BY fasst dann die Zeilen in jeder Gruppe zusammen und behält nur den Wert der Spalte JobTitle und die Anzahl.

Beispiel #2: GROUP BY Mehrere Spalten

Natürlich können Sie Zeilen nach mehr als einer Spalte gruppieren.

In diesem Beispiel sehen wir uns eine Beispiel orders Tabelle, die grundlegende Bestellinformationen enthält:

OrderIDCustomerIDProductIDProductCategoryOrderDateStatusAmount
11011001Electronics2023-05-01Completed150.00
21021002Clothing2023-05-02Completed80.00
31011001Home Goods2023-06-03In progress60.00
4103NULLAccessories2023-06-03Canceled200.00
51011002Electronics2023-07-04NULL120.00
61021001NULL2023-07-05NULLNULL
71031002Clothing2023-07-06In progress90.00
81021002Accessories2023-08-07NULL75.00
9103NULLNULL2023-08-08NULL100.00
101011001Home Goods2023-09-09NULLNULL
111021001Home Goods2023-06-05In progress80.00
121031004Accessories2023-06-06Completed75.00
131021005Electronics2023-08-06Completed88.00

Wir müssen eine Abfrage schreiben, die die Anzahl der von jedem Kunden aufgegebenen Bestellungen und die ProductCategory der jeweiligen Bestellung anzeigt. Das bedeutet, dass wir die CustomerID und die Kategorie, in die die Bestellung fällt, zurückgeben müssen.

Die Abfrage sieht wie folgt aus:

SELECT
  CustomerID,
  ProductCategory,
  COUNT(*) AS NumberOfOrders
FROM orders
GROUP BY CustomerID, ProductCategory;

Das Ergebnis der Abfrage ist unten zu sehen:

CustomerIDProductCategoryNumberOfOrders
101Electronics2
101Home Goods2
102Electronics2
102Accessories2
102Clothing1
103Accessories2
103Clothing1
103NULL1

Unsere Abfrage gruppiert Zeilen nach zwei Spalten: CustomerID und ProductCategory. Das bedeutet, dass GROUP BY Zeilen mit den gleichen Werten von CustomerID und ProductCategory in einer Gruppe zusammenfasst. (Zeilen für CustomerID 101 und die Kategorie Electronics sind in einer Gruppe, aber Zeilen für CustomerID 101 und die Kategorie Home Goods sind in einer anderen Gruppe.) Dann werden die Zeilen in jeder Gruppe durch COUNT() gezählt.

Beispiel Nr. 3: Verwendung von WHERE mit COUNT() und GROUP BY

In unserem vorherigen Beispiel haben wir ein Szenario analysiert, in dem wir ein Aggregat aus allen Informationen in unserer orders Tabelle. Manchmal möchten wir jedoch diese Informationen aufschlüsseln und nur die Bestellungen für ausgewählte Kategorien anzeigen.

Unter Verwendung derselben Beispieldaten, die wir zuvor hatten, werden wir nun eine Abfrage schreiben, die dieselben Informationen für Bestellungen anzeigt, die in die Kategorien "Accessoires" oder "Kleidung" fallen ProductCategory.

Dazu können wir die Abfrage aus Beispiel 2 verwenden und lediglich eine WHERE Klausel hinzufügen. Diese Klausel filtert nach Datensätzen, bei denen ProductCategory gleich "Accessoires" oder "Bekleidung" ist.

SELECT
  CustomerID,
  ProductCategory,
  COUNT(*) AS NumberOfOrders
FROM orders
WHERE ProductCategory IN (‘Accessories’, ‘Clothing’)
GROUP BY CustomerID, ProductCategory;
CustomerIDProductCategoryNumberOfOrders
102Accessories2
103Accessories1
102Clothing1
103Clothing1

Falls es nicht ganz intuitiv ist, wie die Datenbank die Ergebnisse mit der obigen Abfrage erzeugt hat, hier eine schrittweise Erklärung, was hinter den Kulissen passiert ist:

  1. Zunächst durchsucht die Datenbank die orders Tabelle und liest alle Zeilen.
  2. Dann wendet sie die Filterbedingung in WHERE ProductCategory IN (‘Accessories’, ‘Clothing’ ) an, um die Zeilen zu filtern. Nach diesem Schritt werden nur die Zeilen, deren Produktkategorie "Accessoires" oder "Kleidung" ist, für die weitere Verarbeitung berücksichtigt.
  3. Die gefilterten Zeilen werden dann auf der Grundlage der Werte in den Spalten CustomerID und ProductCategory gruppiert, die in der Klausel GROUP BY angegeben sind.
  4. Für jede der eindeutigen Kombinationen von CustomerID und ProductCategory wird die Funktion COUNT(*) angewendet. Dadurch wird die Anzahl der Zeilen innerhalb jeder Gruppe gezählt.
  5. Die endgültige Ergebnismenge enthält die CustomerID, ProductCategory und die Anzahl der Bestellungen (in der Spalte NumberOfOrders ) für jede Gruppe.

Zusammenfassend lässt sich sagen, dass die Datenbank die Zeilen filtert, die die angegebene Filterbedingung erfüllen. Anschließend werden sie nach den in der Klausel GROUP BY angegebenen Spalten gruppiert und die Anzahl der Bestellungen in jeder dieser Gruppen berechnet. Die endgültige Ausgabe enthält CustomerID, ProductCategory und die entsprechende Anzahl der Bestellungen für jede eindeutige Kombination von CustomerID und ProductCategory.

Beispiel Nr. 4: Verwendung von ORDER BY mit COUNT() und GROUP BY

Wenn man sich das Ergebnis von Beispiel 4 ansieht, kann man erkennen, dass einige der Zeilen in der Ausgabe gemischt sind. Das liegt daran, dass die Spalten in der Liste GROUP BY im Allgemeinen eine Sortierung der Ausgabe auf der Grundlage der Liste der Spalten im Abschnitt GROUP BY erfordern, aber nicht garantieren.

Wenn wir aber beispielsweise die Ergebnisse nach verschiedenen Bedingungen ordnen müssen (z. B. nach einer Zeitleiste oder nach Datum), müssen wir eine ORDER BY-Klausel verwenden :

SELECT
  CustomerID,
  ProductCategory,
  COUNT(*) AS NumberOfOrders
FROM orders
WHERE ProductCategory IN (‘Accessories’, ‘Electronics’)
GROUP BY CustomerID, ProductCategory
ORDER BY ProductCategory, CustomerID;
CustomerIDProductCategoryNumberOfOrdes
101Accessories2
102Accessories2
102Electronics1
103Electronics2

Wir haben die ORDER BY Klausel mit der Liste der Spalten, nach denen wir die Daten sortieren wollen, hinzugefügt. Wie Sie sehen können, werden die Ausgabedaten auf der Grundlage der Reihenfolge der aufgeführten Spalten sortiert.

Beispiel Nr. 5: COUNT(Ausdruck)

Bisher haben wir uns einfache Beispiele für die Arbeit mit COUNT() angeschaut; der Zweck war, alle Zeilen im Quelldatensatz oder in der Tabelle zu zählen.

Es gibt jedoch auch komplexere Möglichkeiten, die Kombination COUNT–GROUP BY zu verwenden. Um dies zu erklären, werden wir einen neuen Beispieldatensatz erstellen.

Wir haben eine Tabelle namens SurveyResponses die Antworten auf eine Umfrage speichert. Einige der Fragen sind optional, weshalb es einige Befragte mit Antwortwerten von NULL gibt; sie haben die optionalen Fragen übersprungen. Sie können die Beispieldaten unten sehen:

ResponseIDRespondentIDRespondentNameQuestionIDAnswer
1101John1Agree
2101John2No
3101John3Yes
4102Sarah1Yes
5102Sarah2Not Sure
6102Sarah3NULL
7103Mark1No
8103Mark2Maybe
9103Mark3No
10104Emily1Yes
11104Emily2Not Sure
12104Emily3Disagree

COUNT(*) - Zählen von Zeilen

Die häufigste Verwendung der Funktion COUNT (und ihre Standardfunktionalität, auch wenn sie mit GROUP BY verwendet wird) besteht darin, die Anzahl der Zeilen zu zählen. Wenn wir beispielsweise die Antworttypen von Umfragefragen zählen wollen, können wir die folgende Abfrage verwenden:

SELECT COUNT(*) AS NumberOfYesAnswers, Answer
FROM SurveyResponses
GROUP BY Answer;

Die Ausgabe sieht dann so aus:

NumberOfAnswersAnswer
3Yes
3No
2Not Sure
1Agree
1Disagree
1Maybe
1NULL

Das Ergebnis dieser Abfrage ist eine Zählung aller Zeilen, die einer bestimmten Antwort entsprechen. Sie gibt die Gesamtzahl der Umfrageantworten und den Typ der Antwort zurück.

Zählen von NON-NULL-Werten in einer Spalte

Schauen wir uns ein anderes Beispiel an, das auf den ersten Blick die gleichen Ergebnisse liefern könnte. In diesem Beispiel gibt es jedoch eine wichtige Besonderheit: Anstatt * als Parameter in unserer Funktion COUNT() zu verwenden, verwenden wir COUNT() mit einem Spaltennamen.

Wir werden die Abfrage im vorherigen Beispiel ändern. Anstelle des Parameters * für die Funktion COUNT() werden wir ihn durch die Spalte Answer ersetzen. Unsere neue Abfrage sieht wie folgt aus:

SELECT 
  COUNT(Answer) AS NumberOfAnswers, 
  AnswerFROM SurveyResponses
GROUP BY Answer;

Wenn wir diese neue Abfrage ausführen, werden wir feststellen, dass die zurückgegebenen Ergebnisse fast genau dieselben sind:

NumberOfAnswersAnswer
3Yes
3No
2Not Sure
1Agree
1Disagree
1Maybe
0NULL

Wir können sehen, dass sich die Ausgabe für den NULL Antwortwert von 1 auf 0 geändert hat. Das liegt daran, dass die Funktion COUNT() bei der Aggregation nur die Werte berücksichtigt, die nichtNULL sind.

Vorher haben wir COUNT(*) verwendet, was implizit bedeutet, dass die Zeilen gezählt werden; COUNT(Answer) wird die Werte in der Spalte Answer zählen. Und da wir mit NULL einen Wert hatten, werden diese Werte bei der Berechnung übersprungen - in diesem zweiten Szenario wird 0 zurückgegeben.

Zählen von eindeutigen NON-NULL-Werten in einer Spalte

In dieser dritten Variante der Verwendung der Funktion COUNT verwenden wir dieselbe Abfrage wie in unserem vorherigen Beispiel. Dieses Mal fügen wir jedoch das Schlüsselwort DISTINCT vor dem Spaltennamen hinzu.

SELECT 
  Answer, 
  COUNT(DISTINCT Answer) AS DistinctCount
FROM SurveyResponses
GROUP BY Answer;
StatusDistinctCount
Yes1
No1
Not Sure1
Agree1
Disagree1
Maybe1
NULL0

In der obigen Ausgabe können wir sehen, dass das Ergebnis dieser Abfrage alle positiven Werte in der Spalte DistinctCount auf 1 gesetzt hat. Das Hinzufügen des Schlüsselworts DISTINCT bedeutet, dass die Funktion COUNT jedes Mal, wenn sie einen neuen Wert findet, den sie noch nicht gesehen hat, diesen Status zu ihrer Liste hinzufügt und eine 1 zu ihrer Anzahl hinzufügt. Findet sie jedoch denselben Statuswert ein zweites Mal oder öfter, überspringt sie das Zählen.

Möchten Sie mehr über COUNT() und GROUP BY wissen?

Die Verwendung von COUNT() mit GROUP BY ist nur eine der vielen leistungsstarken Funktionen, die SQL bietet. Wenn Sie SQL weiter erforschen und seine Möglichkeiten wirklich beherrschen möchten, empfehle ich Ihnen unseren umfassenden Kurs SQL für Anfänger . Wenn Sie auf der Suche nach SQL-Übungen sind, empfehle ich Ihnen unseren SQL-Praxis Track, der über 600 SQL-Übungen enthält.

Nachdem Sie unsere Kurse besucht haben, haben Sie vielleicht das Gefühl, dass Sie einen Job im Bereich SQL finden möchten. Um Ihnen bei der Vorbereitung auf Ihr Vorstellungsgespräch zu helfen, haben wir eine Liste von SQL-Vorstellungsfragen zusammengestellt, die Ihnen einige Beispiele für Fragen und Probleme in SQL aus der Praxis zeigt.