Zurück zur Artikelliste Artikel
13 Leseminuten

Wie man SUM() mit GROUP BY verwendet: Ein detaillierter Leitfaden mit 8 Beispielen

Lernen Sie einige praktische Beispiele für die Verwendung von SUM() und GROUP BY in SQL kennen, von den einfachsten bis zu den anspruchsvollsten.

SUM() ist eine SQL-Aggregatfunktion, die die Summe der angegebenen Werte berechnet. GROUP BY ist eine SQL-Klausel, die Zeilen in Gruppen unterteilt und für jede Gruppe eine bestimmte Aggregatfunktion berechnet. Wenn Sie diese beiden Funktionen zusammen verwenden, können Sie die Gesamtsummen für eine Gruppe von Zeilen berechnen.

In diesem Artikel werden wir 8 verschiedene Beispiele sehen, wie Sie SUM() und GROUP BY kombinieren können, um viele verschiedene Berichte zu erstellen. Wir sprechen über den einfachsten Anwendungsfall und behandeln einige komplexe Szenarien.

Der beste Weg, um Ihre SQL-Kenntnisse aufzufrischen - einschließlich SUM() und GROUP BY - ist unser interaktives SQL-Übungssatz. Er enthält 88 interaktive Übungen, die verschiedene SQL-Themen abdecken. Der Kurs eignet sich hervorragend zur Vorbereitung auf ein Vorstellungsgespräch oder zur Wiederholung vor einer SQL-Prüfung.

Beispiel 1: Grundlegende Verwendung von SUM() und GROUP BY in SQL

Schauen wir uns ein Beispiel an, wie die Funktion SUM() zusammen mit GROUP BY funktioniert:

SELECT 
  country, 
  SUM(quantity) AS total_quantity
FROM orders
GROUP BY country;

Die Abfrage gibt eine Liste aller Länder zurück, die in der Tabelle orders Tabelle gefunden wurden, zusammen mit einer Gesamtsumme der Bestellmengen für jedes Land. Die Zeilen in der orders werden in Gruppen eingeteilt (eine Gruppe für jedes Land) und die Datenbank summiert die Mengenwerte für jedes Land.

countrytotal_quantity
United States37
United Kingdom43
Mexico12
New Zealand30

Eine detaillierte Aufschlüsselung von Beispiel 1

Lassen Sie uns dieses Beispiel im Detail analysieren.

Hier sind die Daten in der orders Tabelle. Diese Tabelle ist in einem E-Commerce-System üblich; sie enthält neben dem Bestimmungsland der Ware und der bestellten Menge auch Daten über den Verkäufer, der die Bestellung aufgenommen hat, die Produkt-SKU, das Bestelldatum und die Adresse des Kunden.

order_noorder_datesalespersonproduct_skuquantityamountaddresscountry
10948022023-04-03Meghan99005500346410845.2528 Morningview Lane New YorkUnited States
10948032023-04-04Stephen99004800642712705.54666 Lawman Avenue AlexandriaUnited States
10948042023-04-05Arthur77006100721915914.423445 Queens Lane LynchburgUnited States
10948052023-04-06Stephen990055003464181012.6693 Iffley Road BrockbridgeUnited Kingdom
10948062023-04-07Meghan990048006427252045.7299 Felix Lane ShirleyUnited Kingdom
10948072023-04-08Arthur770061007219Av. Cantera No. 954 Baja CaliforniaMexico
10948082023-04-05Meghan990055003464Sanchez Marmol 408 TabascoMexico
10948092023-04-06Stephen990048006427197 Glencairn Street DunedinNew Zealand
10948102023-04-04Arthur77006100721916842.06139 Petherick Crescent WellingtonNew Zealand
10948112023-04-09Arthur990055003464Rio Reforma 1730 JaliscoMexico
10948122023-04-08Meghan99004800642712912.45Municipal 114 VeracruzMexico
10948132023-04-06Stephen77006100721914799.45105 Queen Elizabeth II Drive WakapuakaNew Zealand

Die Tabelle Bestellungen wird in diesem Artikel durchgehend verwendet.

Die Funktion SUMME() in SQL

Die Funktion SUM() ist eine der Aggregatfunktionen von SQL. Aggregatfunktionen in SQL geben einen einzigen Wert für einen Satz von Zeilen zurück. Die Funktion SUM() gibt die Summe der an die Funktion übergebenen Argumente zurück. Es gibt noch weitere SQL-Aggregatfunktionen, aber in diesem Artikel werden wir uns nur auf SUM() konzentrieren.

Wenn wir SUM() zu der Abfrage hinzufügen ...

SELECT SUM(quantity)
FROM orders;

... erhalten wir nur einen einzigen Wert, der sich aus der Summierung aller Mengenwerte ergibt:

SUM(quantity)
122

Beachten Sie, dass die Funktion SUM() NULL-Werte ignoriert. Sie werden bei der Berechnung als 0 behandelt. Weitere Informationen über die Funktion SUM() finden Sie in dieser vollständigen Erklärung der SQL-Funktion SUM().

Die Funktion SUM() wird, wie auch andere Aggregatfunktionen, normalerweise mit der Klausel GROUP BY verwendet.

Die GROUP BY-Klausel in SQL

Die GROUP BY Klausel wird verwendet, um Statistiken für eine Gruppe von Zeilen zu berechnen; die Zeilen werden auf der Grundlage der Werte einer oder mehrerer Spalten in Gruppen eingeteilt. Die Anweisung SELECT mit GROUP BY gibt eine einzelne Zeile für jede eindeutige Gruppe zurück, die in der Klausel GROUP BY definiert ist.

Kehren wir zu unserer Beispielabfrage zurück:

SELECT 
  country, 
  SUM(quantity) AS total_quantity
FROM orders
GROUP BY country;

Die Zeilen in der Tabelle orders Tabelle sind aufgrund dieser Zeile in Gruppen aufgeteilt, die auf dem Wert der Spalte country basieren: GROUP BY country. Sie weist die Datenbank an, Zeilen mit demselben Wert country in eine Gruppe zu legen.

order_noorder_datesalespersonproduct_skuquantityamountaddresscountry
10948072023-04-08Arthur770061007219Av. Cantera No. 954 Baja CaliforniaMexico
10948082023-04-05Meghan990055003464Sanchez Marmol 408 TabascoMexico
10948112023-04-09Arthur990055003464Rio Reforma 1730 JaliscoMexico
10948122023-04-08Meghan99004800642712912.45Municipal 114 VeracruzMexico
10948092023-04-06Stephen990048006427197 Glencairn Street DunedinNew Zealand
10948102023-04-04Arthur77006100721916842.06139 Petherick Crescent WellingtonNew Zealand
10948132023-04-06Stephen77006100721914799.45105 Queen Elizabeth II Drive WakapuakaNew Zealand
10948052023-04-06Stephen990055003464181012.6693 Iffley Road BrockbridgeUnited Kingdom
10948062023-04-07Meghan990048006427252045.7299 Felix Lane ShirleyUnited Kingdom
10948022023-04-03Meghan99005500346410845.2528 Morningview Lane New YorkUnited States
10948032023-04-04Stephen99004800642712705.54666 Lawman Avenue AlexandriaUnited States
10948042023-04-05Arthur77006100721915914.423445 Queens Lane LynchburgUnited States

Zeilen für Mexiko werden in eine Gruppe eingeordnet, Zeilen für Neuseeland in eine andere Gruppe und so weiter. Die Funktion SUMME() wird dann auf die Mengenwerte in jeder Gruppe angewendet. Die Summe für die Vereinigten Staaten ist die Summe von 10, 12 und 15, was 37 ergibt. Die Summe für das Vereinigte Königreich ist die Summe von 18 und 25, was 43 ergibt, usw.

Hier ist noch einmal das Ergebnis unserer Abfrage. Sie können sehen, dass jede Zeile die Summe der Mengenwerte in der entsprechenden Gruppe enthält.

countrytotal_quantity
United States37
United Kingdom43
Mexico12
New Zealand30

Die GROUP BY Klausel ist besonders nützlich, wenn Sie zusammenfassende Informationen aus Tabellen mit zu vielen Zeilen erhalten möchten, um sie einzeln durchzugehen. Weitere Informationen finden Sie in einer vollständigen Erklärung der SQL-Klausel GROUP BY oder in diesem Artikel über GROUP BY in SQL.

Beispiel 2: Berechnen von 2 SUMMEN und Gruppieren nach 2 Spalten

Im vorherigen Beispiel haben wir gesehen, wie man SUM() und GROUP BY verwendet, um einen Datensatz nach der Spalte Land zu gruppieren und die Gesamtmenge für jedes Land separat zu erhalten. Mit GROUP BY können Sie auch nach mehr als einer Spalte gruppieren und mehr als eine Summe in einer Abfrage berechnen.

Wenn wir alle Kombinationen von country und salesperson in der Tabelle kennen möchten und die Summe der bestellten Mengen und deren Beträge für jede Kombination erhalten möchten, müssen wir SUM() und GROUP BY verwenden.

Hier ist die Abfrage:

SELECT 
  country, 
  salesperson, 
  SUM(quantity) AS qtyTotal,
  SUM(amount) AS amntTotal
FROM orders
GROUP BY country, salesperson;

Ausgehend von der obigen Tabelle ergibt diese Abfrage die folgenden Daten:

countrysalespersonqtyTotalamntTotal
United StatesMeghan10845.25
United StatesStephen12705.50
United StatesArthur15914.42
United KingdomStephen181012.65
United KingdomMeghan252045.72
MexicoArthurNULLNULL
MexicoMeghan12912.45
New ZealandStephen14799.45
New ZealandArthur16842.06

Wir haben zwei Ausdrücke, die die Funktion SUM() in der Abfrage verwenden: der eine berechnet die Gesamtmenge, der andere den Gesamtbetrag. Wir gruppieren auch nach zwei Spalten: country und salesperson.

Intern führt die Datenbankmaschine den folgenden Vorgang aus:

  1. Sie erstellt eine Ergebnismenge aus der in der Klausel FROM angegebenen Tabelle und gruppiert die Zeilen für jede Kombination von Werten der in der Klausel GROUP BY angegebenen Spalten. In unserem Beispiel werden Zeilen mit demselben Wert von country und salesperson gruppiert: eine Zeile für die Verkäufe von Meghan in den USA, eine Zeile für die Verkäufe von Stephen in den USA, usw.
  2. Für jede Zeile in der im vorherigen Schritt erstellten Ergebnismenge wird die Summe jeder Spalte berechnet, die von einem SUM() eingeschlossen ist. In unserem Beispiel wird die Summe der Spalten quantity und amount berechnet.
  3. Es gibt die Ergebnismenge mit den Summen zurück.

Sie können nach mehr als zwei Spalten gruppieren, wenn Sie dies benötigen. Sie können über die Gruppierung nach mehreren Spalten in unserem Artikel How to Group by Multiple Columns in SQL lesen.

Beispiel 3: Verwendung einer WHERE-Bedingung mit SUM und GROUP BY

Sie können eine WHERE Bedingung in Ihrer Abfrage mit SUM() und GROUP BY verwenden. In diesem Fall ändert die Datenbankmaschine die oben gezeigte Prozedur, um die Ergebnisse der Abfrage zurückzugeben. Sie wendet die WHERE Klausel in Schritt 1 der Prozedur an. Dann wird die erste Ergebnismenge aus den Zeilen zusammengestellt, die die Bedingung WHERE erfüllen.

Die von der WHERE Bedingung betroffenen Spalten können beliebige Spalten der Tabelle sein. Es spielt keine Rolle, ob sie in der GROUP BY -Klausel aufgeführt sind oder nicht oder ob sie als Ergebnis der Abfrage zurückgegeben werden oder nicht.

In unserem Beispiel könnten wir jede der Spalten in der Tabelle orders Tabelle verwenden, z. B. product_sku oder order_date. Wir sind an Bestellungen für das Produkt mit der SKU 990048006427 interessiert, die zwischen dem 7. April 2023 und dem 8. April 2023 getätigt wurden.

SELECT 
  country, 
  salesperson, 
  SUM(quantity) AS qtyTotal,
  SUM(amount) AS amntTotal
FROM orders
WHERE 
  product_sku = '990048006427' 
  AND order_date BETWEEN '2023-04-07' AND '2023-04-08'
GROUP BY country, salesperson;

Um diese Abfrage zu lösen, erstellt die Datenbank-Engine zunächst eine temporäre Ergebnismenge aus der Tabelle orders Tabelle, die die Bedingungen der WHERE Klausel erfüllt. Aus dieser Ergebnismenge werden alle Kombinationen aus den Spalten country und salesperson entnommen. Für jede Kombination berechnet sie die Summen von quantity und amount.

countrysalespersonqtyTotalamntTotal
United KingdomMeghan252045.72
MexicoMeghan12912.45

Beachten Sie, dass beim Vergleich des Ergebnisses mit Beispiel 2 nur Bestellungen zwischen dem 7. April 2023 und dem 8. April 2023 für das Produkt 990048006427 berücksichtigt werden. Es gibt zum Beispiel keine Zeilen für Meghans Verkäufe in den Vereinigten Staaten, da sie dieses Produkt an diesen beiden Apriltagen nicht verkauft hat.

Beispiel 4: Verwendung der ORDER BY-Klausel mit SUMME und GROUP BY

Wenn wir der Abfrage, die wir mit SUM() und GROUP BY erstellen, auch eine ORDER BY-Klausel hinzufügen, muss die Datenbankmaschine etwas mehr Arbeit leisten. Sie fügt einen weiteren Schritt zu den drei oben beschriebenen hinzu; dieser Schritt besteht darin, die Ergebnisse nach den in der ORDER BY -Klausel angegebenen Kriterien zu sortieren.

Zum Beispiel könnten wir die Ergebnisse nach der Summe von amount sortieren, indem wir sie mit dem Alias amntTotal referenzieren. Wir könnten auch den vollständigen Ausdruck SUM(amount) angeben:

SELECT 
  country, 
  salesperson, 
  SUM(quantity) AS qtyTotal, 
  SUM(amount) AS amntTotal
FROM orders
GROUP BY country, salesperson
ORDER BY amntTotal DESC;

In diesem Beispiel fügen wir die Klausel DESC hinzu, damit die Ergebnisse vom höchsten zum niedrigsten Wert sortiert werden.

countrysalespersonqtyTotalamntTotal
United KingdomMeghan252045.72
United KingdomStephen181012.66
United StatesArthur15914.42
MexicoMeghan12912.45
United StatesMeghan10845.25
New ZealandArthur16842.06
New ZealandStephen14799.45
United StatesStephen12705.5
MexicoArthurNULLNULL

Beispiel 5: Summenausdrücke

Die Funktion SUM kann nicht nur auf einzelne Spalten angewendet werden, sondern auch auf Ausdrücke, die numerische Werte liefern. Angenommen, wir haben eine Spalte unit_price anstelle einer Betragsspalte. Der Bestellbetrag würde sich aus der Multiplikation von quantity mit unit_price ergeben.

Damit die SQL SUM GROUP BY in diesem Fall eine Summe der bestellten Beträge zurückgibt, müssen wir die Funktion SUM() auf den Ausdruck quantity * unit_price anwenden:

SELECT 
  country, 
  salesperson, 
  SUM(quantity) AS qtyTotal,
  SUM(quantity * unit_price) AS amntTotal
FROM orders
GROUP BY country, salesperson;

Das Ergebnis der Abfrage wäre das gleiche wie in Beispiel 2:

countrysalespersonqtyTotalamntTotal
United StatesMeghan10845.25
United StatesStephen12705.50
United StatesArthur15914.42
United KingdomStephen181012.65
United KingdomMeghan252045.72
MexicoArthurNULLNULL
MexicoMeghan12912.45
New ZealandStephen14799.45
New ZealandArthur16842.06

Das von der Datenbankmaschine durchgeführte Verfahren wäre ein wenig anders. Für jede Gruppe würde sie zuerst den Wert des Ausdrucks quantity * unit_price berechnen und dann die Summen anhand der berechneten Werte berechnen.

Beispiel 6: Nullwerte in der Funktion SUMME()

Bei Verwendung der Funktion SUM() in SQL wird NULLs ignoriert und nicht in die Berechnung der Summe einbezogen. Wenn eine Zeile in der orders Tabelle NULL Werte in den Spalten quantity oder amount enthält, werden diese von der Funktion SUM() ignoriert. Die Ausnahme ist, wenn alle Werte für eine der Spalten NULL sind. In diesem Fall gibt die Funktion SUM() auch NULL zurück.

Dieser Vorbehalt betrifft die Kombination SUM() und GROUP BY. Wenn es einige Kombinationen der Werte der GROUP BY Spalten gibt, bei denen alle summierten Werte NULL sind, dann gibt SUM() auch NULL für diese Kombination von Werten zurück.

In unserer Beispielbestelltabelle haben alle Zeilen für country='Mexico' und salesperson='Arthur' einen NULL Wert in Menge und Betrag. Aus diesem Grund gibt das Ergebnis von SUM() und GROUP BY in der Summe von Menge und Betrag für country = 'Mexico' und salesperson = 'Arthur' den Wert NULL zurück. Allerdings sind weder Arthur noch Mexiko in einer ihrer anderen Kombinationen NULL.

Schauen Sie nach:

SELECT 
  country, 
  salesperson, 
  SUM(quantity) AS qtyTotal,
  SUM(amount) AS amntTotal
FROM orders
WHERE country = 'Mexico' AND Salesperson = 'Arthur'
GROUP BY country, salesperson;
countrysalespersonqtyTotalamntTotal
MexicoArthurNULLNULL

Wenn eine neue Zeile für country = 'Mexico' und salesperson = 'Arthur' mit Werten, die nichtNULL sind, in quantity und amount eingefügt würde, dann würden die restlichen Werte von NULL in der Summe ignoriert werden. Die Ergebnisse von SUM() würden nur die Werte enthalten, die nicht NULLs in den zu summierenden Spalten haben.

Beispiel 7: Konvertierung von NULL-Werten in Nullen

Wir haben gesehen, dass die Funktion SUM() NULL zurückgibt, wenn alle Werte in der summierten Spalte NULL sind. Wenn es nur einen Wert gibt, der nichtNULL ist, werden die restlichen NULL Werte ignoriert, d.h. sie werden so behandelt, als wären sie Nullen.

Dies kann schwierig zu erklären sein, wenn man Datenerzählungen durchführt. Wir wollen vermeiden, dass das Wort "NULL" in einem Ergebnisfeld erscheint, in dem eigentlich eine Zahl stehen sollte (und damit Verwirrung bei unseren Zuhörern stiftet). In solchen Fällen ist es sinnvoll, die Werte von NULL in Nullen umzuwandeln. Zu diesem Zweck können Sie die Funktion COALESCE verwenden. Sie wandelt die Werte von NULL in einer Spalte in einen bestimmten Wert um - normalerweise Null, obwohl auch andere Werte verwendet werden können.

In unserem Beispiel wollen wir nicht riskieren, dass NULL -Werte in quantity oder amount dazu führen, dass der Text "NULL" in unseren Ergebnissen erscheint. Wir können diese Spalten in die Funktion COALESCE einschließen und das Ergebnis dieser Funktion als Parameter der Funktion SUM() senden:

SELECT 
  country, 
  salesperson, 
  SUM(COALESCE(quantity, 0)) AS qtyTotal,
  SUM(COALESCE(amount, 0)) AS amntTotal
FROM orders
GROUP BY country, salesperson;

Auf diese Weise werden alle NULLs in den summierten Spalten als Nullen erscheinen.

countrysalespersonqtyTotalamntTotal
United StatesMeghan10845.25
United StatesStephen12705.50
United StatesArthur15914.42
United KingdomStephen181012.65
United KingdomMeghan252045.72
MexicoArthur00.00
MexicoMeghan12912.45
New ZealandStephen14799.45
New ZealandArthur16842.06

Beachten Sie, dass die Zeile für Arthurs Verkäufe in Mexiko nun 0 anstelle von NULL anzeigt.

Beispiel 8: SUMME() mit Bedingungen

Manchmal soll die Kombination GROUP BY SUM() nur Daten berücksichtigen, die bestimmte Bedingungen erfüllen.

Um bei unserem Beispiel zu bleiben, nehmen wir an, dass jede Bestellung eine Spalte vom Typ BIT mit der Bezeichnung delivered hat, die angibt, ob die Bestellung geliefert wurde oder nicht. Wir möchten vielleicht, dass die Ergebnisse unserer Summierungen in zwei Teile geteilt werden: eine Summe der gelieferten Produkte und eine Summe der nicht gelieferten Produkte. Dies wird durch die Verwendung von CASE WHEN innerhalb der Funktion SUM() gelöst, um den Inhalt der Spalte delivered auszuwerten:

SELECT 
  country,
  SUM(CASE 
    WHEN delivered = 1 THEN quantity 
    ELSE 0 END) AS qtyTotalDelivered,
  SUM(CASE 
    WHEN delivered = 0 THEN quantity 
    ELSE 0 END) AS qtyTotalNotDelivered
FROM orders
GROUP BY country;

Die Anweisung CASE WHEN ähnelt der IF-Anweisung in vielen Programmiersprachen; sie fügt dem Fluss unserer Abfrage eine gewisse Logik hinzu, indem sie eine angegebene Bedingung auswertet. Sie gibt die Bedingung nach WHEN an. Wenn die Bedingung erfüllt ist, wird der Wert nach THEN zurückgegeben. Wenn die Bedingung nicht erfüllt ist, wird der Wert nach ELSE zurückgegeben.

CASE 
    WHEN delivered = 1 THEN quantity 
    ELSE 0 END

In diesem Ausdruck wird für gelieferte Produkte die Spalte quantity zurückgegeben. Für andere Produkte wird 0 zurückgegeben.

Hier ist das Ergebnis der Abfrage:

countryqtyTotalDeliveredqtyTotalNotDelivered
United States2215
United Kingdom1825
Mexico12NULL
New Zealand1416

Weitere Informationen über die Verwendung von CASE WHEN mit SUM und GROUP BY finden Sie an anderer Stelle in unserem Blog.

Üben Sie die Verwendung von SUM() mit GROUP BY in Ihren SQL-Abfragen

In diesem Artikel haben wir acht Beispiele gesehen, wie man SUM() und GROUP BY in SQL-Abfragen kombiniert. Unsere orders Tabelle - obwohl sie nur wenige Zeilen hat - repräsentiert Situationen aus dem wirklichen Leben.

Bei Ihrer Arbeit werden Sie oft auf ähnliche Situationen wie die hier vorgestellten stoßen - allerdings werden Ihre Tabellen mit viel mehr Zeilen gefüllt sein. Sie werden dann alle möglichen Varianten von SUM() und GROUP BY nutzen müssen, um zu beweisen, dass die Ergebnisse Ihrer Abfragen legitim sind.

Profitieren Sie von unserem SQL-Übungssatz Kurs und SQL-Praxis Track, um Ihre SQL-Kenntnisse zu vertiefen. Denken Sie daran: Der wichtigste Aspekt der Arbeit eines Datenanalysten ist, dass die von ihm gelieferten Informationen zu 100 % zuverlässig sind.