Die T-SQL-Abfragesprache von SQL Server bietet eine Vielzahl von Optionen zur Datenabfrage. Dazu gehört die Möglichkeit, eine SQL-Datenbank abzufragen sowie eine Summenfunktion, eine Zählaggregatfunktion und das Gruppieren von Spalten bereitzustellen. Die SQL GROUP BY-Klausel kann all diese Funktionen nutzen. In diesem Artikel zeige ich Ihnen, wie die GROUP BY-Klausel allein oder in Verbindung mit einer der Aggregatfunktionen verwendet werden kann, um Berechnungen basierend auf der Gruppierung durchzuführen.
Wie funktioniert die SQL GROUP BY-Klausel?
Die SQL GROUP BY-Klausel wird mit dem SELECT-Statement verwendet, um Daten in Gruppen identischer Daten anzuordnen. Sie folgt der WHERE-Klausel in einem SELECT-Statement.
Diese Klausel wird am häufigsten mit Aggregatfunktionen wie SUM, COUNT, AVG, MAX oder MIN verwendet, die es Ihnen ermöglichen, Berechnungen mit gruppierten Daten durchzuführen. Sie können die Daten nach verschiedenen Spaltentypen gruppieren, darunter Zahlen wie Produkt-IDs, Datumswerte oder Zeichenfolgen wie Beschreibungen.
Die grundlegende Syntax von GROUP BY ist recht einfach:
SELECT column1, aggregate_function(column2) FROM table_name GROUP BY column1;
Hier können Sie die GROUP BY-Klausel bei einer einfachen SELECT-Anweisung sehen. Die SELECT-Anweisung greift auf zwei Spalten zu, und die zweite Spalte verwendet eine Aggregationsfunktion.
Die Verwendung einer Aggregationsfunktion ist nicht technisch erforderlich, aber sie ist eine sehr häufige Ergänzung zur GROUP BY-Klausel. Die Gruppierung erfolgt anhand der Daten in der ersten Spalte.
Tauchen wir tiefer ein und sehen die GROUP BY-Klausel in Aktion.
Verwenden der SQL GROUP BY mit einer SELECT-Anweisung
Zunächst schauen wir uns an, wie man die SQL GROUP BY-Klausel mit einer einfachen SELECT-Anweisung ohne Aggregationsfunktion verwendet. Die folgende Auflistung greift und gruppiert die ‚Product ID‘-Spalte aus der SalesLT.SalesOrderDetail-Tabelle in der AdventureWorksLT2019-Beispieldatenbank.
USE AdventureWorksLT2019; SELECT ProductID FROM SalesLT.SalesOrderDetail GROUP BY ProductID;
Dies liefert im Wesentlichen eine Liste aller bestellten ProductIDs, wie Sie in der folgenden Abbildung sehen können.

Verwenden von SQL GROUP BY mit Aggregationsfunktionen
Es ist üblicher, die SQL GROUP BY-Klausel zusammen mit einer der Aggregatfunktionen zu verwenden, die Ihnen eine Anzahl, Gesamtsumme, Durchschnitt oder Zusammenfassung aller zusammengefassten Spalten geben können. Die folgende Anweisung verwendet GROUP BY mit der Tabelle SalesLT.Product aus der AdventureWorksLT2019-Datenbank, um die Gesamtanzahl der Produkte in jeder Produktkategorie zu finden:
USE AdventureWorksLT2019; SELECT ProductCategoryID, COUNT(*) AS TotalProducts FROM SalesLT.Product GROUP BY ProductCategoryID;
In diesem Beispiel gibt die SELECT-Anweisung die Spalte „ProductCategoryID“ aus der Tabelle SalesLT.Product zurück und zählt die Anzahl der Produkte in jeder Kategorie mit der COUNT(*)-Aggregatfunktion. Hier gruppiert die GROUP BY-Klausel die Ergebnisse nach der „ProductCategoryID“, während die SELECT COUNT-Funktion die Gesamtanzahl der Produkte in jeder Produktkategorie berechnet. Die Ergebnisse der COUNT(*)-Funktion verwenden das Alias „TotalProducts“.
Die Ergebnisse dieser Abfrage sind in der folgenden Abbildung dargestellt. Diese Ausgabe zeigt die Gesamtanzahl der Produkte in jeder Produktkategorie, die mithilfe der GROUP BY-Klausel berechnet wurde. Die Zusammenfassungsinformationen werden von der COUNT(*)-Aggregatfunktion zurückgegeben.

Verwendung von SQL GROUP BY mit mehreren Spalten
Die SQL GROUP BY-Funktion ist nicht auf die Arbeit mit einer einzelnen Spalte beschränkt. Sie kann auch gleichzeitig mit mehreren Spalten in derselben Abfrage verwendet werden.
Lassen Sie uns ein Beispiel für die Verwendung der GROUP BY-Klausel mit zwei Spalten aus der Tabelle SalesLT.Product in der AdventureWorksLT2019-Datenbank betrachten. Die folgende Abfrage zeigt, wie die Gesamtanzahl an Produkten für jede Produktkategorie und jedes Produktmodell abgerufen werden kann.
USE AdventureWorksLT2019; SELECT ProductCategoryID, ProductModelID, COUNT(*) AS TotalProducts FROM SalesLT.Product GROUP BY ProductCategoryID, ProductModelID;
Hier werden die Spalten ‚ProductCategoryID‘ und ‚ProductModelID‘ abgerufen und wir verwenden die Aggregatfunktion COUNT(*), um die Anzahl der Produkte in jeder Produktkategorie und Unterkategorie zu zählen. In diesem Beispiel gruppiert die GROUP BY-Klausel die Ergebnisse beider Spalten ‚ProductCategoryID‘ und ‚ProductModelID‘. Dadurch entstehen zwei verschiedene Gruppen basierend auf den beiden verschiedenen Spalten.
Sie können die Ergebnisse dieser Abfrage in der folgenden Abbildung sehen. Diese Ergebnisse zeigen die Gesamtanzahl an Produkten und Produktmodellen, wobei die Gesamtanzahl unter Verwendung des Spaltenalias TotalProducts abgerufen wird.

Verwendung von SQL GROUP BY mit der HAVING-Klausel
Eine weitere häufige Verwendung der GROUP BY-Klausel besteht darin, sie mit der HAVING-Klausel zu kombinieren. Tatsächlich können Sie die GROUP BY-Klausel mit der HAVING-Klausel verwenden, um die Ergebnisse einer Abfrage basierend auf den Bedingungen zu filtern, die die HAVING-Klausel auf die Daten gruppiert. Die Bedingung kann auf eine reguläre Datentypspalte oder auf eine Aggregatfunktion angewendet werden.
Lassen Sie uns ein Beispiel für die Verwendung der SQL GROUP BY-Klausel zusammen mit der HAVING-Klausel mit der AdventureWorksLT2019-Datenbank betrachten. Dieses Beispiel zeigt, welche Kunden Bestellungen in der Tabelle SalesLT.SalesOrderHeader mit einem Gesamtauftragswert von mehr als 2000 USD aufgegeben haben. Hier wird die GROUP BY-Klausel verwendet, um Bestellungen nach Kunden zu gruppieren, und dann filtert die HAVING-Klausel Kunden basierend auf dem Gesamtauftragswert heraus.
USE AdventureWorksLT2019; SELECT c.CustomerID, c.FirstName, c.LastName, SUM(soh.TotalDue) AS TotalOrderAmount FROM SalesLT.Customer c JOIN SalesLT.SalesOrderHeader soh ON c.CustomerID = soh.CustomerID GROUP BY c.CustomerID, c.FirstName, c.LastName HAVING SUM(soh.TotalDue) > 2000;
- In dieser Code-Liste wird die Tabelle SalesLT.Customer mit der Tabelle SalesLT.SalesOrderHeader anhand der Spalte „CustomerID“ verbunden.
- Die SELECT-Liste ruft „CustomerID“, „FirstName“, „LastName“ und „TotalOrderAmount“ ab.
- Die GROUP BY-Klausel wird verwendet, um die Ergebnisse nach Kunden zu gruppieren.
- Die SUM()-Aggregatfunktion berechnet den Gesamtauftragswert für jeden Kunden.
- Die HAVING-Klausel filtert die gruppierten Ergebnisse, um nur Kunden auszuwählen, deren Gesamtauftragswert größer als 2000 USD ist.
Sie können die Ergebnisse dieser Code-Liste in der folgenden Abbildung sehen:

Verwendung von SQL GROUP BY mit der ORDER BY-Klausel
Sie können auch die SQL GROUP BY-Klausel mit der ORDER BY-Klausel verwenden, um das Ergebnis nach einer oder mehreren Spalten zu sortieren. Das folgende Beispiel verwendet die AdventureWorksLT2019-Datenbank. Um die Verwendung der ORDER BY-Klausel mit der GROUP BY-Klausel zu veranschaulichen, können Sie einfach den vorherigen Beispielcode übernehmen und die ORDER BY-Klausel hinzufügen, um die Ergebnisse so zu sortieren, dass die größten Auftragsbeträge in absteigender Reihenfolge angezeigt werden.
USE AdventureWorksLT2019; SELECT c.CustomerID, c.FirstName, c.LastName, SUM(soh.TotalDue) AS TotalOrderAmount FROM SalesLT.Customer c JOIN SalesLT.SalesOrderHeader soh ON c.CustomerID = soh.CustomerID GROUP BY c.CustomerID, c.FirstName, c.LastName HAVING SUM(soh.TotalDue) > 2000 ORDER BY TotalOrderAmount DESC;
Sie können die Ergebnisse in der folgenden Abbildung sehen. Diese Ergebnisse zeigen die Liste der Kunden mit Bestellungen über 2000 $ in absteigender Reihenfolge, wobei die Kunden mit den größten Bestellungen oben stehen.

Wie Sie sehen können, können Sie mit der SQL GROUP BY-Klausel eine ganze Menge tun. Ich habe Ihnen gezeigt, wie die GROUP BY-Klausel mit mehreren Spalten verwendet werden kann, sowie wie die HAVING- und ORDER BY-Klauseln hinzugefügt werden können, um die Ergebnisse zu filtern und zu sortieren.
Wie immer können Sie gerne Fragen zur SQL GROUP BY-Klausel stellen. Und wenn Sie mehr über den SQL Server erfahren möchten, schauen Sie sich gerne die vorherigen Artikel in meiner SQL Server Essential-Serie an.
Source:
https://petri.com/sql-group-by/