Freigeben über


SELECT - GROUP BY-Klausel (Transact-SQL)

Gilt für:SQL ServerAzure SQL-DatenbankVerwaltete Azure SQL-InstanzAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL-Analyseendpunkt in Microsoft FabricLagerhaus in Microsoft FabricSQL-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 mehreren UNION ALLGROUP BY Abfragen 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 innen GROUPING 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(...) oder GROUP 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 SELECT Liste definieren. Sie kann einen Spaltenalias für eine abgeleitete Tabelle verwenden, die in der FROM Klausel 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() und CAST(). Diese Regel gilt auch für Ausdrücke in der HAVING Klausel.
  • 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 NULL Werten 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 BY Klausel nicht zulässig, es sei denn, sie sind Teil einer expliziten GROUPING SETS Liste. Ist beispielsweise GROUP BY Column1, (Column2, ...ColumnN) im Standard, aber nicht in Transact-SQL zulässig. Transact-SQL unterstützt GROUP BY C1, GROUPING SETS ((Column2, ...ColumnN)) und GROUP BY Column1, Column2, ... ColumnN, die semantisch gleichwertig sind. Diese Klauseln entsprechen semantisch dem vorherigen GROUP BY Beispiel. Diese Einschränkung vermeidet die Möglichkeit, dass GROUP BY Column1, (Column2, ...ColumnN) sie falsch interpretiert GROUP 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 erlaubt GROUP BY GROUPING SETS( A1, A2,...An, C1, C2, ...Cn) oder GROUP BY GROUPING SETS( (A1), (A2), ... (An), (C1), (C2), ... (Cn)), die semantisch dem ersten GROUP BY Beispiel 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 WHERE Klausel 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 BY verwendenGROUP BY ALL, GROUP BY DISTINCT die Spaltenausdrücke enthält. Sie können sie nicht mit den GROUPING SETSKonstrukten , ROLLUP, , CUBEWITH CUBEoder WITH ROLLUP Konstrukten verwenden. ALL ist 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 SELECT Liste einschließen, GROUP BY wird 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>)und SUM(DISTINCT <column_name>) arbeiten mit , und arbeiten mit ROLLUP, CUBEund GROUPING SETS.

WHERE-Klausel:

  • SQL entfernt Zeilen, die die Bedingungen in der WHERE Klausel nicht erfüllen, bevor sie einen Gruppierungsvorgang ausführt.

HAVING-Klausel:

  • SQL verwendet die HAVING Klausel zum Filtern von Gruppen im Resultset.

ORDER BY-Klausel:

  • Verwenden Sie die ORDER BY Klausel, um das Resultset zu ordnen. Die GROUP BY Klausel sortiert das Resultset nicht.

NULL Werte:

  • Wenn eine Gruppierungsspalte Werte enthält NULL , behandelt das Datenbankmodul alle NULL Werte 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 CUBE
    

    Für abwärtskompatible GROUP BY Klauseln, die GROUP BY keine CUBEROLLUPSpaltengrößen, die aggregierten Spalten und die Aggregatwerte enthalten, die an der Abfrage beteiligt sind, beschränken die Anzahl der GROUP BY Elemente. 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 angeben CUBE oder ROLLUP.

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;