SQL Server GROUP BY-Klausel
- 14-09-2022
- Toanngo92
- 0 Comments
kombiniert
Mục lục
Gruppieren nach.-Klausel
Die GROUP BY -Klausel unterteilt die Ergebnismenge in eine oder mehrere Teilmengen. Jede Teilmenge hat gemeinsame Werte und Ausdrücke. Auf das Schlüsselwort GROUP BY folgt eine Liste von Spalten, die gruppierte Spalte genannt wird. Jede gruppierte Spalte schränkt die Anzahl der Zeilen der Ergebnismenge ein. Für jede gruppierte Spalte gibt es nur eine Zeile. Die GROUP BY-Klausel kann mehr als eine gruppierte Spalte haben.
Syntax:
SELECT select_list FROM table_name GROUP BY column_name1,column_name2, ... ;
Betrachten Sie das Szenario der WorkOrderRouting -Tabelle in AdventureWorks2019 . Die gesamten Ressourcenstunden für jeden Arbeitsauftrag müssen berechnet werden. Um dies zu erreichen, müssen die Datensätze nach der Arbeitsauftragsnummer gruppiert werden, die die WorkOrderID- Spalte ist
Das folgende Beispiel ruft die gesamten Ressourcenstunden für jeden Arbeitsauftrag zusammen mit der Arbeitsauftragsnummer ab und zeigt sie an. In dieser Abfrage wird eine integrierte Funktion namens SUM() verwendet, um die Summe zu berechnen. SUM() ist eine Funktion, die die Datensätze einer Spalte summiert.
SELECT WorkOrderID,SUM(ActualResourceHrs) AS TotalHoursPerWorkOrder FROM Production.WorkOrderRouting GROUP BY WorkOrderID
Die Ausführungsanweisung gibt alle WorkOrders und gesamten Ressourcenstunden zurück.
Die GROUP BY- Klausel kann auch in Verbindung mit anderen Klauseln verwendet werden, wie zum Beispiel:
GROUP BY mit WO
Die WHERE-Klausel kann mit der GROUP BY-Klausel verwendet werden, um Zeilen für die Datengruppierung einzuschränken. Zeilen, die die Suchkriterien erfüllen, werden für die Neugruppierung berücksichtigt. Zeilen, die die Suchkriterien nicht erfüllen, werden entfernt, bevor der Gruppierungsprozess abgeschlossen ist.
Zum Beispiel:
SELECt WorkOrderID,SUM(ActualResourceHrs) AS TotalHoursPerWorkOrder FROM Production.WorkOrderRouting WHERE WorkOrderID < 50 GROUP BY WorkOrderID
GROUP BY mit NULL
Wenn die Gruppenspalte null enthält, wird die Zeile in der Ergebnismenge zu einer separaten Gruppe. Wenn die Gruppenspalte mehr als einen NULL-Wert enthält, werden die NULL-Werte in eine einzelne Zeile aufgenommen. Betrachten Sie die Production.Product -Tabelle. Es gibt einige Zeilen, in denen ein NULL-Wert in der Klasse -Spalte vorhanden ist.
Die Verwendung von GROUP BY für eine Tabellenabfrage verwendet ebenfalls NULL-Werte. Der folgende Code ruft beispielsweise den Durchschnittspreis des Listenpreises für jede Klasse ab und zeigt ihn an
SELECT Class, AVG(ListPrice) AS 'AverageListPrice' FROM Production.Product GROUP BY Class
GROUP BY mit ALL
Das Schlüsselwort ALL kann mit der GROUP BY-Klausel verwendet werden. Es macht nur Sinn, wenn das SELECT eine WHERE-Klausel hat. Wenn ALL verwendet wird, schließt es alle Gruppen ein, die die GROUP BY-Klausel erstellt. Es schließt sogar Gruppen ein, die die Suchbedingungen nicht erfüllen.
Syntax:
SELECT <column_name> FROM <table_name> WHERE <condition> GROUP BY ALL <column_name>
Betrachten Sie die Sales.SalesTerritory-Tabelle mit einer Spalte namens Group , die den Koordinatenstandort des Verkaufsbereichs angibt. Der folgende Code berechnet und zeigt den Gesamtumsatz für jede Gruppe an. Die Ausgabe muss alle Gruppen anzeigen, unabhängig davon, ob sie Verkäufe haben oder nicht. Um dies zu erreichen, verwendet der Code GROUP BY mit ALL
SELECT [Group], SUM(SalesYTD) AS 'TotalSales' FROM Sales.SalesTerritory WHERE [Group] LIKE 'N%' OR [Group] LIKE 'E%' GROUP BY ALL [Group]
GROUP BY mit HABEN
Die HAVING-Klausel wird mit der SELECT-Anweisung verwendet, um eine Suchbedingung für eine Gruppe anzugeben. Die HAVING-Klausel verhält sich an Stellen wie eine WHERE-Klausel, an denen die WHERE-Klausel nicht für Aggregatfunktionen wie SUM() verwendet werden kann. Nachdem Sie Gruppen mit der GROUP BY-Klausel erstellt haben, möchten Sie die Ergebnisse möglicherweise weiter filtern. Die HAVING-Klausel fungiert als Filter für Zeilen, ähnlich wie die WHERE-Klausel als Filter für die Zeilen fungiert, die von der FROM-Klausel zurückgegeben werden.
Syntax:
SELECT <column_name> FROM <table_name> GROUP BY <column_name> HAVING <search_condition>
Zum Beispiel:
SELECT [Group],SUM(SalesYTD) AS 'TotalSales' FROM Sales.SalesTerritory WHERE [Group] LIKE 'P%' GROUP BY ALL [Group] HAVING SUM (SalesYTD) < 6000000
Daten zusammenfassen
Die GROUP BY-Klausel verwendet auch die CUBE- und ROLLUP-Operatoren, um Zusammenfassungsdaten zurückzugeben. Die Anzahl der Spalten in der GROUP BY-Klausel bestimmt die Anzahl der Zusammenfassungszeilen in der Ergebnismenge. Die Operatoren werden wie folgt beschrieben:
WÜRFEL
CUBE ist der Aggregatoperator, der eine Super-Aggregat-Zeile generiert. Zusätzlich zu den regulären Zeilen, die von GROUP BY bereitgestellt werden, bietet es auch eine Zusammenfassung der Zeilen, die die GROUP BY-Klausel erzeugt.
Die für jede mögliche Kombination von Gruppen angezeigte Zusammenfassungszeile ist die Ergebnismenge. Die Summary-Zeile zeigt NULL in der Ergebnismenge, gibt aber gleichzeitig alle Werte für diese zurück.
Syntax:
SELECT <column_name> FROM <table_name> GROUP BY <column_name> WITH CUBE
Zum Beispiel:
Der Service zeigt den Gesamtumsatz für jedes Land, mit Ausnahme von Australien und Kanada
SELECT Name, CountryRegionCode, SUM(SalesYTD) AS TotalSales FROM Sales.SalesTerritory WHERE Name <> 'Australia' AND Name <> 'Canada' GROUP BY Name,CountryRegionCode WITH CUBE
CUBE ist wie eine Erweiterung der GROUP BY-Klausel. CUBE ermöglicht es Ihnen, Zwischensummen für alle Gruppenspaltenkombinationen zu erstellen, die in der GROUP BY-Klausel angegeben sind.
AUFROLLEN
Zusätzlich zu den regulären Zeilen, die von GROUP BY generiert werden, werden auch Zusammenfassungszeilen in die Ergebnismenge eingefügt. Er ähnelt dem CUBE-Operator, erzeugt jedoch eine Ergebnismenge, die die Gruppen in hierarchischer Reihenfolge anzeigt. Es sortiert die Gruppen von der niedrigsten zur höchsten. Die Gruppierungshierarchie in den Ergebnissen hängt von der Reihenfolge ab, in der die gruppierten Spalten angegeben werden
Syntax:
SELECT <column_name1>[,<column_name2>] FROM <table_name> GROUP BY < WITH ROLLUP
Zum Beispiel:
SELECT [Name], SUM(SalesYTD) AS TotalSales FROM Sales.SalesTerritory GROUP BY [Name] WITH ROLLUP