Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Gilt für:SQL Server
Azure SQL-Datenbank
Verwaltete Azure SQL-Instanz
Azure Synapse Analytics
Analytics Platform System (PDW)
SQL-Analyseendpunkt in Microsoft Fabric
Lagerhaus in Microsoft Fabric
SQL-Datenbank in Microsoft Fabric
Eine SELECT Anweisungsklausel, die das Abfrageergebnis in Zeilengruppen aufteilt, in der Regel durch Ausführen einer oder mehrerer Aggregationen für jede Gruppe. Die SELECT Anweisung gibt eine Zeile für jede Gruppe zurück.
Syntax
Transact-SQL-Syntaxkonventionen
ISO-kompatible Syntax für SQL Server- und Azure SQL-Datenbank:
GROUP BY {
column-expression
| ROLLUP ( <group_by_expression> [ , ...n ] )
| CUBE ( <group_by_expression> [ , ...n ] )
| GROUPING SETS ( <grouping_set> [ , ...n ] )
| () --calculates the grand total
} [ , ...n ]
<group_by_expression> ::=
column-expression
| ( column-expression [ , ...n ] )
<grouping_set> ::=
() --calculates the grand total
| <grouping_set_item>
| ( <grouping_set_item> [ , ...n ] )
<grouping_set_item> ::=
<group_by_expression>
| ROLLUP ( <group_by_expression> [ , ...n ] )
| CUBE ( <group_by_expression> [ , ...n ] )
Nicht ISO-kompatible Syntax für SQL Server- und Azure SQL-Datenbank (nur Abwärtskompatibilität):
GROUP BY {
ALL column-expression [ , ...n ]
| column-expression [ , ...n ] WITH { CUBE | ROLLUP }
}
Syntax für Azure Synapse Analytics:
GROUP BY {
column-name [ WITH (DISTRIBUTED_AGG) ]
| column-expression
| ROLLUP ( <group_by_expression> [ , ...n ] )
} [ , ...n ]
Syntax für Analytics Platform System (PDW):
GROUP BY {
column-name [ WITH (DISTRIBUTED_AGG) ]
| column-expression
} [ , ...n ]
Arguments
column-expression
Gibt eine Spalte oder eine nicht aggregierte Berechnung für eine Spalte an. Diese Spalte kann zu einer (abgeleiteten) Tabelle oder Sicht gehören. Die Spalte muss in der FROM Klausel der SELECT Anweisung angezeigt werden, muss aber nicht in der SELECT Liste angezeigt werden.
Gültige Ausdrücke finden Sie unter expression.
Die Spalte muss in der FROM Klausel der SELECT Anweisung angezeigt werden, muss aber nicht in der SELECT Liste angezeigt werden. Sie müssen jedoch jede Tabelle oder Ansichtsspalte in die GROUP BY Liste einschließen, wenn Sie sie in einem nicht aggregierten Ausdruck in der <select> Liste verwenden.
GRUPPIEREN NACH-Optionen
Die folgenden Optionen erweitern die Basisklausel GROUP BY , um hierarchische Aggregation, mehrdimensionale Zusammenfassungen, benutzerdefinierte Gruppierungskombinationen und plattformspezifische Ausführungsverhalten zu unterstützen. Abfragen können diese Optionen verwenden, um Teilergebnisse und Gesamtsummen in einem einzigen logischen Vorgang zu erzeugen.
ROLLUP ( <group_by_expression> [ , ... n ] )
Generiert hierarchische Teilergebnisse für die aufgelisteten Spalten und eine endgültige Gesamtsumme (z
(a,b,c). B. , ,(a,b), ,(a)()). Verwenden Sie sie für Drillupberichte wie den Monatdes Jahresquartals>>.CUBE ( <group_by_expression> [ , ... n ] )
Erzeugt alle Kombinationen der angegebenen Spalten (den vollständigen 2^n-Gitter) und die Gesamtsumme. Verwenden Sie sie für mehrdimensionale Analysen in jedem Segment.
GRUPPIERUNGSSÄTZE ( <grouping_set> [ , ... n ] )
Definiert die genauen Gruppierungen, die in einem Durchgang berechnet werden sollen (einschließlich
()gesamter Gesamtsumme). Diese Option ist funktionell mit mehrerenUNION ALLGROUP BYAbfragen vergleichbar, aber zusammen optimiert.() (leerer Gruppierungssatz)
Shorthand für die Berechnung der Gesamtsumme über alle Zeilen hinweg. Verwenden Sie es allein als
GROUP BY ()oder innenGROUPING SETS.ALLE Spaltenausdruck [ , ... n ](Nicht-ISO; Abwärtskompatibilität)
Kurzform zum Gruppieren nach allen nicht aggregierten Auswahlelementen. Aus Gründen der Kompatibilität beibehalten; Verfügbarkeit und Semantik variieren.
Spaltenausdruck [ , ... n ] WITH { CUBE | 'ROLLUP }(Legacyformular)
Ältere, nicht ISO-Syntax, die entspricht
GROUP BY CUBE(...)oderGROUP BY ROLLUP(...). Wird nur aus Gründen der Abwärtskompatibilität unterstützt. Verwenden Sie nach Möglichkeit die ISO-Unterclauses.WITH (DISTRIBUTED_AGG)
Gibt die verteilte Ausführung für Aggregationen beim Gruppieren nach einer einzelnen Spalte an. Azure Synapse Analytics dedizierte SQL-Pools und Analytics Platform System (PDW) sind die einzigen Plattformen, die diese Option unterstützen.
GROUP BY-Spaltenausdruck [ ,... n ]
Gruppiert die Ergebnisse der SELECT Anweisung entsprechend den Werten in einer Liste mit einem oder mehreren Spaltenausdrücken.
Diese Abfrage erstellt beispielsweise eine Sales Tabelle mit Spalten für Region, Territoryund Sales. Es fügt vier Zeilen ein, und zwei der Zeilen weisen übereinstimmende Werte für Region und Territory.
CREATE TABLE Sales
(
Region VARCHAR (50),
Territory VARCHAR (50),
Sales INT
);
GO
INSERT INTO Sales VALUES (N'Canada', N'Alberta', 100);
INSERT INTO Sales VALUES (N'Canada', N'British Columbia', 200);
INSERT INTO Sales VALUES (N'Canada', N'British Columbia', 300);
INSERT INTO Sales VALUES (N'United States', N'Montana', 100);
Die Sales Tabelle enthält die folgenden Zeilen:
| Region | Gebiet | Sales |
|---|---|---|
| Canada | Alberta | 100 |
| Canada | British Columbia | 200 |
| Canada | British Columbia | 300 |
| United States | Montana | 100 |
Diese nächste Abfrage gruppiert Region und Territory gibt die Aggregatsumme für jede Kombination von Werten zurück.
SELECT Region,
Territory,
SUM(sales) AS TotalSales
FROM Sales
GROUP BY Region, Territory;
Das Abfrageergebnis weist drei Zeilen auf, da es drei Kombinationen von Werten für Region und Territory. Das TotalSales für Kanada und British Columbia ist die Summe von zwei Zeilen.
| Region | Gebiet | TotalSales |
|---|---|---|
| Canada | Alberta | 100 |
| Canada | British Columbia | 500 |
| United States | Montana | 100 |
Der Spaltenausdruck in GROUP BY darf folgendes nicht enthalten:
- Ein Spaltenalias, den Sie in der
SELECTListe definieren. Sie kann einen Spaltenalias für eine abgeleitete Tabelle verwenden, die in derFROMKlausel definiert ist. - Eine Spalte vom Typ text, ntext oder image. Sie können jedoch eine Spalte mit Text, nText oder Bild als Argument für eine Funktion verwenden, die einen Wert eines gültigen Datentyps zurückgibt. Der Ausdruck kann z. B. verwenden
SUBSTRING()undCAST(). Diese Regel gilt auch für Ausdrücke in derHAVINGKlausel. - XML-Datentypmethoden . Sie kann eine benutzerdefinierte Funktion enthalten, die XML-Datentypmethoden verwendet. Sie kann eine berechnete Spalte enthalten, die XML-Datentypmethoden verwendet.
- Eine Unteranfrage. Die Abfrage gibt Den Fehler 144 zurück.
- Eine Spalte aus einer indizierten Sicht.
Die folgenden Anweisungen sind zulässig:
SELECT ColumnA,
ColumnB
FROM T
GROUP BY ColumnA, ColumnB;
SELECT ColumnA + ColumnB
FROM T
GROUP BY ColumnA, ColumnB;
SELECT ColumnA + ColumnB
FROM T
GROUP BY ColumnA + ColumnB;
SELECT ColumnA + ColumnB + constant
FROM T
GROUP BY ColumnA, ColumnB;
Die folgenden Anweisungen sind nicht zulässig:
SELECT ColumnA,
ColumnB
FROM T
GROUP BY ColumnA + ColumnB;
SELECT ColumnA + constant + ColumnB
FROM T
GROUP BY ColumnA + ColumnB;
NACH ROLLUP GRUPPIEREN ()
Erstellt eine Gruppe für jede Kombination von Spaltenausdrücken. Darüber hinaus werden die Ergebnisse in Teilergebnisse und Gesamtsummen zusammengefasst. Wenn sie die Gruppen erstellt, wird sie von rechts nach links verschoben, wodurch die Anzahl der Spaltenausdrücke für Gruppierung und Aggregationen verringert wird.
Die Spaltenreihenfolge wirkt sich auf die ROLLUP Ausgabe aus und kann sich auf die Anzahl der Zeilen im Resultset auswirken.
Erstellt beispielsweise GROUP BY ROLLUP (col1, col2, col3, col4) Gruppen für jede Kombination von Spaltenausdrücken in den folgenden Listen:
- Col1, Col2, Col3, Col4
- Col1, Col2, Col3, NULL
- Col1, Col2, NULL, NULL
- Col1, NULL, NULL, NULL, NULL
- NULL, NULL, NULL, NULL (Die Gruppe mit den
NULLWerten ist die Gesamtsumme)
Mit der Tabelle aus dem vorherigen Beispiel führt dieser Code einen GROUP BY ROLLUP Vorgang anstelle eines einfachen GROUP BYVorgangs aus.
SELECT Region,
Territory,
SUM(Sales) AS TotalSales
FROM Sales
GROUP BY ROLLUP(Region, Territory);
Das Abfrageergebnis hat die gleichen Aggregationen wie das Grundlegende GROUP BY ohne die ROLLUP. Darüber hinaus werden Teilergebnisse für jeden Wert der Region erstellt. Schließlich gibt er ein Gesamtergebnis für alle Zeilen zurück. Das Ergebnis sieht wie folgt aus:
| Region | Gebiet | TotalSales |
|---|---|---|
| Canada | Alberta | 100 |
| Canada | British Columbia | 500 |
| Canada | NULL | 600 |
| United States | Montana | 100 |
| United States | NULL | 100 |
| NULL | NULL | 700 |
GRUPPIEREN NACH CUBE ()
GROUP BY CUBE erstellt Gruppen für alle möglichen Kombinationen von Spalten. Für GROUP BY CUBE (a, b)die Ergebnisse sind Gruppen für eindeutige Werte von (a, b), , (NULL, b), (a, NULL)und (NULL, NULL).
Mit der Tabelle aus den vorherigen Beispielen führt dieser Code einen GROUP BY CUBE Vorgang auf Region und Gebiet aus.
SELECT Region,
Territory,
SUM(Sales) AS TotalSales
FROM Sales
GROUP BY CUBE(Region, Territory);
Das Abfrageergebnis enthält Gruppen für eindeutige Werte von (Region, Territory), , (NULL, Territory), (Region, NULL)und (NULL, NULL). Das Ergebnis sieht folgendermaßen aus:
| Region | Gebiet | TotalSales |
|---|---|---|
| Canada | Alberta | 100 |
| NULL | Alberta | 100 |
| Canada | British Columbia | 500 |
| NULL | British Columbia | 500 |
| United States | Montana | 100 |
| NULL | Montana | 100 |
| NULL | NULL | 700 |
| Canada | NULL | 600 |
| United States | NULL | 100 |
GRUPPIEREN NACH GRUPPENSÄTZEN ()
Die GROUPING SETS Option kombiniert mehrere GROUP BY Klauseln in einer GROUP BY Klausel. Die Ergebnisse sind identisch mit der Verwendung UNION ALL in den angegebenen Gruppen.
GROUP BY ROLLUP (Region, Territory) und GROUP BY GROUPING SETS ( ROLLUP (Region, Territory)) geben z.B. die gleichen Ergebnisse zurück.
Wenn GROUPING SETS zwei oder mehr Elemente vorhanden sind, sind die Ergebnisse eine Vereinigung der Elemente. In diesem Beispiel wird die Vereinigung der ROLLUP Regionen und CUBE Ergebnisse für Region und Gebiet zurückgegeben.
SELECT Region,
Territory,
SUM(Sales) AS TotalSales
FROM Sales
GROUP BY GROUPING SETS(ROLLUP(Region, Territory), CUBE(Region, Territory));
Die Ergebnisse sind identisch mit dieser Abfrage, die eine Vereinigung der beiden GROUP BY Anweisungen zurückgibt.
SELECT Region,
Territory,
SUM(Sales) AS TotalSales
FROM Sales
GROUP BY ROLLUP(Region, Territory)
UNION ALL
SELECT Region,
Territory,
SUM(Sales) AS TotalSales
FROM Sales
GROUP BY CUBE(Region, Territory);
SQL konsolidiert keine doppelten Gruppen, die für eine GROUPING SETS Liste generiert wurden. In diesem Beispiel GROUP BY ((), CUBE (Region, Territory))geben beide Elemente eine Zeile für die Gesamtsumme zurück, und beide Zeilen werden in den Ergebnissen angezeigt.
Unterstützung für ISO- und ANSI SQL-2006 GROUP BY-Features
Die GROUP BY Klausel unterstützt alle GROUP BY Features, die im SQL-2006-Standard enthalten sind, mit den folgenden Syntax exceptions:
Gruppierungssätze sind in der
GROUP BYKlausel nicht zulässig, es sei denn, sie sind Teil einer explizitenGROUPING SETSListe. Ist beispielsweiseGROUP BY Column1, (Column2, ...ColumnN)im Standard, aber nicht in Transact-SQL zulässig. Transact-SQL unterstütztGROUP BY C1, GROUPING SETS ((Column2, ...ColumnN))undGROUP BY Column1, Column2, ... ColumnN, die semantisch gleichwertig sind. Diese Klauseln entsprechen semantisch dem vorherigenGROUP BYBeispiel. Diese Einschränkung vermeidet die Möglichkeit, dassGROUP BY Column1, (Column2, ...ColumnN)sie falsch interpretiertGROUP BY C1, GROUPING SETS ((Column2, ...ColumnN))werden könnte als , die nicht semantisch gleichwertig sind.Gruppierungssätze sind in Gruppierungssätzen nicht zulässig. Beispielsweise ist
GROUP BY GROUPING SETS (A1, A2,...An, GROUPING SETS (C1, C2, ...Cn))in SQL-2006 Standard zulässig, in Transact-SQL allerdings nicht. Transact-SQL erlaubtGROUP BY GROUPING SETS( A1, A2,...An, C1, C2, ...Cn)oderGROUP BY GROUPING SETS( (A1), (A2), ... (An), (C1), (C2), ... (Cn)), die semantisch dem erstenGROUP BYBeispiel entsprechen und eine klarere Syntax aufweisen.
GRUPPIEREN NACH ()
Gibt die leere Gruppe an, die die Gesamtsumme generiert. Diese Gruppe ist nützlich als eines der Elemente eines .GROUPING SET Diese Anweisung gibt beispielsweise den Gesamtumsatz für jede Region an und gibt dann die Gesamtsumme für alle Regionen an.
SELECT Region,
SUM(Sales) AS TotalSales
FROM Sales
GROUP BY GROUPING SETS(Region, ());
GROUP BY ALL-Spaltenausdruck [ ,... n ]
Gilt für: SQL Server und Azure SQL Database
Note
Verwenden Sie diese Syntax nur aus Gründen der Abwärtskompatibilität. Vermeiden Sie die Verwendung dieser Syntax bei neuen Entwicklungen, und planen Sie die Änderung von Anwendungen, in denen diese Syntax zurzeit verwendet wird.
Gibt an, ob alle Gruppen in die Ergebnisse einbezogen werden sollen, unabhängig davon, ob sie die Suchkriterien in der WHERE Klausel erfüllen. Gruppen, die die Suchkriterien nicht erfüllen, weisen NULL die Aggregation auf.
GROUP BY ALL:
- Wird in Abfragen, die auf Remotetabellen zugreifen, nicht unterstützt, wenn es auch eine
WHEREKlausel in der Abfrage gibt. - Schlägt bei Spalten mit dem FILESTREAM-Attribut fehl.
Unterstützung für ISO- und ANSI SQL-2006 GROUP BY-Features
Die GROUP BY Klausel unterstützt alle GROUP BY Features, die im SQL-2006-Standard enthalten sind, mit den folgenden Syntax exceptions:
- Sie können nur eine Standardklausel
GROUP BYverwendenGROUP BY ALL,GROUP BY DISTINCTdie Spaltenausdrücke enthält. Sie können sie nicht mit denGROUPING SETSKonstrukten ,ROLLUP, ,CUBEWITH CUBEoderWITH ROLLUPKonstrukten verwenden.ALList der Standardwert und ist implizit. Sie können sie nur in der abwärtskompatiblen Syntax verwenden.
GROUP BY-Spaltenausdruck [ ,... n ] WITH { CUBE | ROLLUP }
Gilt für: SQL Server und Azure SQL Database
Note
Verwenden Sie diese Syntax nur aus Gründen der Abwärtskompatibilität. Vermeiden Sie die Verwendung dieser Syntax bei neuen Entwicklungen, und planen Sie die Änderung von Anwendungen, in denen diese Syntax zurzeit verwendet wird.
MIT (DISTRIBUTED_AGG)
Gilt für: Azure Synapse Analytics and Analytics Platform System (PDW)
Der DISTRIBUTED_AGG Abfragehinweis erzwingt das massive parallele Verarbeitungssystem (MPP), eine Tabelle in einer bestimmten Spalte neu zu verteilen, bevor eine Aggregation ausgeführt wird. Sie können den DISTRIBUTED_AGG Abfragehinweis nur für eine Spalte in der GROUP BY Klausel verwenden. Nachdem die Abfrage abgeschlossen ist, wird die neu verteilte Tabelle gelöscht. Die ursprüngliche Tabelle wird nicht geändert.
Note
Der DISTRIBUTED_AGG Abfragehinweis bietet Abwärtskompatibilität mit früheren PDW-Versionen (Analytics Platform System) und verbessert die Leistung für die meisten Abfragen nicht. Standardmäßig verteilt MPP bereits bei Bedarf Daten zur Verbesserung der Leistung für Aggregationen.
Bemerkungen
So interagiert GROUP BY mit der SELECT-Anweisung
SELECT Liste:
- Vektoraggregate. Wenn Sie Aggregatfunktionen in die
SELECTListe einschließen,GROUP BYwird für jede Gruppe ein Zusammenfassungswert berechnet. Diese Funktionen werden als Vektoraggregate bezeichnet. - Deutliche Aggregate. Die Aggregate
AVG(DISTINCT <column_name>),COUNT(DISTINCT <column_name>)undSUM(DISTINCT <column_name>)arbeiten mit , und arbeiten mitROLLUP,CUBEundGROUPING SETS.
WHERE-Klausel:
- SQL entfernt Zeilen, die die Bedingungen in der
WHEREKlausel nicht erfüllen, bevor sie einen Gruppierungsvorgang ausführt.
HAVING-Klausel:
- SQL verwendet die
HAVINGKlausel zum Filtern von Gruppen im Resultset.
ORDER BY-Klausel:
- Verwenden Sie die
ORDER BYKlausel, um das Resultset zu ordnen. DieGROUP BYKlausel sortiert das Resultset nicht.
NULL Werte:
- Wenn eine Gruppierungsspalte Werte enthält
NULL, behandelt das Datenbankmodul alleNULLWerte gleich und sammelt sie in einer einzelnen Gruppe.
Einschränkungen
Gilt für: SQL Server und Azure Synapse Analytics
Bei einer GROUP BY Klausel, die die maximale Anzahl von Ausdrücken verwendet ROLLUP, CUBEoder GROUPING SETSdie maximale Anzahl von Ausdrücken ist 32. Die maximale Anzahl von Gruppen beträgt 4.096 (212). Die folgenden Beispiele schlagen fehl, da die GROUP BY Klausel mehr als 4.096 Gruppen enthält.
Das folgende Beispiel generiert 4.097 (212 + 1) Gruppierungssätze und schlägt dann fehl.
GROUP BY GROUPING SETS( CUBE(a1, ..., a12), b)Das folgende Beispiel generiert 4.097 (212 + 1) Gruppen und schlägt dann fehl. Sowohl die
CUBE ()- als auch die()-Gruppierungssätze generieren eine Gesamtergebniszeile, und doppelte Gruppierungssätze werden nicht entfernt.GROUP BY GROUPING SETS( CUBE(a1, ..., a12), ())In diesem Beispiel wird die abwärtskompatible Syntax verwendet. Es generiert 8.192 (213) Gruppierungssätze und schlägt dann fehl.
GROUP BY CUBE (a1, ..., a13) GROUP BY a1, ..., a13 WITH CUBEFür abwärtskompatible
GROUP BYKlauseln, dieGROUP BYkeineCUBEROLLUPSpaltengrößen, die aggregierten Spalten und die Aggregatwerte enthalten, die an der Abfrage beteiligt sind, beschränken die Anzahl derGROUP BYElemente. Dieser Grenzwert stammt aus dem Grenzwert von 8.060 Bytes für die Zwischenarbeitstabelle, die Zwischenabfrageergebnisse enthält. Sie können maximal 12 Gruppierungsausdrücke verwenden, wenn Sie angebenCUBEoderROLLUP.
Vergleich der unterstützten GROUP BY-Features
In der folgenden Tabelle werden die GROUP BY Features beschrieben, die von verschiedenen Produkten unterstützt werden.
| Feature | SQL Server Integration Services | SQL Server 1 |
|---|---|---|
DISTINCT Aggregate |
Nicht unterstützt für WITH CUBE oder WITH ROLLUP. |
Unterstützt für WITH CUBE, , WITH ROLLUP, GROUPING SETS, CUBEoder ROLLUP. |
Benutzerdefinierte Funktion mit CUBE oder ROLLUP Name in der GROUP BY Klausel |
Benutzerdefinierte Funktion dbo.cube(<arg1>, ...<argN>) oder dbo.rollup(<arg1>, ...<argN>) in der GROUP BY Klausel ist zulässig.Beispiel: SELECT SUM (x) FROM T GROUP BY dbo.cube(y); |
Benutzerdefinierte Funktion dbo.cube (<arg1>, ...<argN>) oder dbo.rollup(<arg1>, ...<argN>) in der GROUP BY Klausel ist nicht zulässig.Beispiel: SELECT SUM (x) FROM T GROUP BY dbo.cube(y);SQL Server gibt eine Fehlermeldung 2 zurück. Ersetzen Sie dbo.cube durch [dbo].[cube] oder dbo.rollup durch [dbo].[rollup], um dieses Problem zu vermeiden.Das folgende Beispiel ist zulässig: SELECT SUM (x) FROM T GROUP BY [dbo].[cube](y); |
GROUPING SETS |
Nicht unterstützt | Supported |
CUBE |
Nicht unterstützt | Supported |
ROLLUP |
Nicht unterstützt | Supported |
Gesamtsumme, z. B. GROUP BY() |
Nicht unterstützt | Supported |
GROUPING_ID-Funktion |
Nicht unterstützt | Supported |
GROUPING-Funktion |
Supported | Supported |
WITH CUBE |
Supported | Supported |
WITH ROLLUP |
Supported | Supported |
WITH CUBE oder WITH ROLLUP "Duplikat"-Gruppierung entfernen |
Supported | Supported |
1Datenbankkompatibilitätsebene 100 und höher.
2 Die zurückgegebene Fehlermeldung lautet: Incorrect syntax near the keyword 'cube'|'rollup'.
Examples
Die Codebeispiele in diesem Artikel verwenden die AdventureWorks2025- oder AdventureWorksDW2025 Beispieldatenbank, die Sie von der Microsoft SQL Server Samples and Community Projects Homepage herunterladen können.
A. Verwenden einer einfachen GROUP BY-Klausel
Im folgenden Beispiel wird die Summe für jede SalesOrderID aus der SalesOrderDetail-Tabelle abgerufen. In diesem Beispiel wird AdventureWorks verwendet.
SELECT SalesOrderID,
SUM(LineTotal) AS SubTotal
FROM Sales.SalesOrderDetail AS sod
GROUP BY SalesOrderID
ORDER BY SalesOrderID;
B. Verwenden einer GROUP BY-Klausel mit mehreren Tabellen
Im folgenden Beispiel wird die Anzahl von Mitarbeitern für die einzelnen City-Spalten der Address-Tabelle abgerufen, die mit der EmployeeAddress-Tabelle verknüpft ist. In diesem Beispiel wird AdventureWorks verwendet.
SELECT a.City,
COUNT(bea.AddressID) AS EmployeeCount
FROM Person.BusinessEntityAddress AS bea
INNER JOIN Person.Address AS a
ON bea.AddressID = a.AddressID
GROUP BY a.City
ORDER BY a.City;
C. Verwenden einer GROUP BY-Klausel mit einem Ausdruck
Im folgenden Beispiel wird der Gesamtumsatz für jedes Jahr mithilfe der DATEPART-Funktion abgerufen. Sie müssen denselben Ausdruck sowohl in der Liste als SELECT auch in der GROUP BY Klausel einschließen.
SELECT DATEPART(yyyy, OrderDate) AS N'Year',
SUM(TotalDue) AS N'Total Order Amount'
FROM Sales.SalesOrderHeader
GROUP BY DATEPART(yyyy, OrderDate)
ORDER BY DATEPART(yyyy, OrderDate);
D. Verwenden einer GROUP BY-Klausel mit einer HAVING-Klausel
Im folgenden Beispiel wird die HAVING Klausel verwendet, um anzugeben, welche In der GROUP BY Klausel generierten Gruppen in das Resultset aufgenommen werden sollen.
SELECT DATEPART(yyyy, OrderDate) AS N'Year',
SUM(TotalDue) AS N'Total Order Amount'
FROM Sales.SalesOrderHeader
GROUP BY DATEPART(yyyy, OrderDate)
HAVING DATEPART(yyyy, OrderDate) >= N'2003'
ORDER BY DATEPART(yyyy, OrderDate);
Beispiele: Azure Synapse Analytics und Analytics-Plattformsystem (PDW)
E. Grundlegende Verwendung der GROUP BY-Klausel
Im folgenden Beispiel wird die Gesamtsumme aller Verkäufe pro Tag gesucht. Die Abfrage gibt eine Zeile zurück, die die Summe aller Umsätze für jeden Tag enthält.
-- Uses AdventureWorksDW
SELECT OrderDateKey,
SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY OrderDateKey
ORDER BY OrderDateKey;
F. Grundlegende Verwendung des DISTRIBUTED_AGG-Hinweises
In diesem Beispiel wird der DISTRIBUTED_AGG Abfragehinweis verwendet, um zu erzwingen, dass die Appliance die Tabelle in der CustomerKey Spalte neu zuordnen kann, bevor die Aggregation ausgeführt wird.
-- Uses AdventureWorksDW
SELECT CustomerKey,
SUM(SalesAmount) AS sas
FROM FactInternetSales
GROUP BY CustomerKey WITH(DISTRIBUTED_AGG)
ORDER BY CustomerKey DESC;
G. Syntaxvariationen für GROUP BY
Wenn die Auswahlliste keine Aggregationen enthält, müssen Sie jede Spalte in die Auswahlliste in der GROUP BY Liste einschließen. Sie können berechnete Spalten in die Auswahlliste einschließen, aber Sie müssen sie nicht in die GROUP BY Liste aufnehmen. Diese Beispiele zeigen syntaktisch gültige SELECT Anweisungen:
-- Uses AdventureWorks
SELECT LastName,
FirstName
FROM DimCustomer
GROUP BY LastName, FirstName;
SELECT NumberCarsOwned
FROM DimCustomer
GROUP BY YearlyIncome, NumberCarsOwned;
SELECT (SalesAmount + TaxAmt + Freight) AS TotalCost
FROM FactInternetSales
GROUP BY SalesAmount, TaxAmt, Freight;
SELECT SalesAmount,
SalesAmount * 1.10 AS SalesTax
FROM FactInternetSales
GROUP BY SalesAmount;
SELECT SalesAmount
FROM FactInternetSales
GROUP BY SalesAmount, SalesAmount * 1.10;
H. Verwenden einer GROUP BY-Klausel mit mehreren GROUP BY-Ausdrücken
Im folgenden Beispiel werden die Ergebnisse mithilfe mehrerer GROUP BY-Kriterien gruppiert. Wenn in jeder OrderDateKey Gruppe Untergruppen vorhanden sind, die vom DueDateKey Wert unterschieden werden, definiert die Abfrage eine neue Gruppierung für das Resultset.
-- Uses AdventureWorks
SELECT OrderDateKey,
DueDateKey,
SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY OrderDateKey, DueDateKey
ORDER BY OrderDateKey;
I. Verwenden einer GROUP BY-Klausel mit einer HAVING-Klausel
Im folgenden Beispiel wird die HAVING Klausel verwendet, um die in der GROUP BY Klausel generierten Gruppen anzugeben, die in das Resultset eingeschlossen werden sollen. Nur diese Gruppen mit Bestelldaten im Jahr 2004 oder höher werden in die Ergebnisse einbezogen.
-- Uses AdventureWorks
SELECT OrderDateKey,
SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY OrderDateKey
HAVING OrderDateKey > 20040000
ORDER BY OrderDateKey;