SELECT - GROUP BY-component (Transact-SQL)

Van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsSQL Analytics-eindpunt in Microsoft FabricMagazijn in Microsoft FabricSQL-database in Microsoft Fabric

Een SELECT instructiecomponent waarmee het queryresultaat wordt verdeeld in groepen rijen, meestal door een of meer aggregaties uit te voeren voor elke groep. De SELECT instructie retourneert één rij voor elke groep.

Dit artikel bevat verschillende syntaxis, argumenten, opmerkingen, machtigingen en voorbeelden op basis van de geselecteerde productversie. Selecteer de gewenste productversie in de vervolgkeuzelijst versie.

Syntax

Transact-SQL syntaxis-conventies

ISO-conforme syntax voor SQL Server, Azure SQL Database, Azure SQL Managed Instance en SQL database in Fabric:

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 ] )

Niet-ISO-conforme syntaxis alleen voor achterwaartse compatibiliteit:

GROUP BY {
       ALL column-expression [ , ...n ]
    | column-expression [ , ...n ]  WITH { CUBE | ROLLUP }
       }

Syntaxis voor Azure Synapse Analytics:

GROUP BY {
      column-name [ WITH (DISTRIBUTED_AGG) ]
    | column-expression
    | ROLLUP ( <group_by_expression> [ , ...n ] )
} [ , ...n ]

Syntaxis voor Fabric Data Warehouse en SQL analytics endpoint:

      ALL
     | {
           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 ] )

Arguments

kolomexpressie

Hiermee geeft u een kolom of een niet-samengevoegde berekening op een kolom. Deze kolom kan behoren tot een tabel, afgeleide tabel of weergave. De kolom moet worden weergegeven in de FROM component van de SELECT instructie, maar hoeft niet in de SELECT lijst te worden weergegeven.

Zie de expressie voor geldige expressies.

De kolom moet worden weergegeven in de FROM component van de SELECT instructie, maar hoeft niet in de SELECT lijst te worden weergegeven. U moet echter elke tabel of weergavekolom in de GROUP BY lijst opnemen als u deze gebruikt in een niet-samengevoegde expressie in de <select> lijst.

GROUP BY-opties

Met de volgende opties wordt de basiscomponent GROUP BY uitgebreid ter ondersteuning van hiërarchische aggregatie, multidimensionale samenvatting, aangepaste groeperingscombinaties en platformspecifieke uitvoeringsgedrag. Query's kunnen deze opties gebruiken om subtotalen en eindtotalen te produceren in één logische bewerking.

  • ROLLUP ( <group_by_expression> [ , ... n ] )

    Hiermee worden hiërarchische subtotalen gegenereerd voor de vermelde kolommen en een eindtotaal (bijvoorbeeld (a,b,c), (a,b), (a)). () Gebruik deze voor drill-uprapporten, zoalsde maand van het kwartaal van>>.

  • KUBUS ( <group_by_expression> [ , ... n ] )

    Produceert alle combinaties van de opgegeven kolommen (het volledige 2^n rooster) plus het eindtotaal. Gebruik deze voor multidimensionale analyse in elk segment.

  • GROEPERINGSSETS ( <grouping_set> [ , ... n ] )

    Definieert de exacte groeperingen die moeten worden berekend (inclusief () voor eindtotaal) in één pas. Deze optie is functioneel vergelijkbaar met een UNION ALL van meerdere GROUP BY query's, maar samen geoptimaliseerd.

  • () (lege groeperingsset)

    Afkorting voor het berekenen van alleen het eindtotaal voor alle rijen. Gebruik het alleen als GROUP BY () of binnen GROUPING SETS.

  • ALL column-expression [ , ... n ](niet-ISO; achterwaartse compatibiliteit)

    Korte hand om te groeperen op alle niet-samengevoegde selectie-items. Behouden voor compatibiliteit; beschikbaarheid en semantiek variëren.

  • column-expression [ , ... n ] WITH { CUBE | 'ROLLUP }(verouderd formulier)

    Oudere, niet-ISO-syntaxis die gelijk is aan GROUP BY CUBE(...) of GROUP BY ROLLUP(...). Alleen ondersteund voor compatibiliteit met eerdere versies. Gebruik indien mogelijk de ISO-subclauses.

  • MET (DISTRIBUTED_AGG)

    Hints voor gedistribueerde uitvoering voor aggregaties bij het groeperen op één kolom. Alleen Azure Synapse Analytics dedicated SQL pools ondersteunen deze optie.

GROUP BY column-expression [ ,... n ]

Groepeert de SELECT instructieresultaten op basis van de waarden in een lijst met een of meer kolomexpressies.

Met deze query maakt u bijvoorbeeld een Sales tabel met kolommen voor Region, Territoryen Sales. Er worden vier rijen ingevoegd en twee van de rijen hebben overeenkomende waarden voor Region en 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);

De Sales tabel bevat deze rijen:

Region Rayon Sales
Canada Alberta 100
Canada Brits-Columbia 200
Canada Brits-Columbia 300
Verenigde Staten Montana 100

Deze volgende querygroepen Region en Territory retourneert de geaggregeerde som voor elke combinatie van waarden.

SELECT Region,
       Territory,
       SUM(sales) AS TotalSales
FROM Sales
GROUP BY Region, Territory;

Het queryresultaat heeft drie rijen omdat er drie combinaties van waarden voor Region en Territory. De TotalSales voor Canada en Brits-Columbia is de som van twee rijen.

Region Rayon TotalSales
Canada Alberta 100
Canada Brits-Columbia 500
Verenigde Staten Montana 100

De kolomexpressie in GROUP BY kan de volgende elementen niet bevatten:

  • Een GROUP BY kolomexpressie kan geen kolomalias bevatten die je in de SELECT lijst definieert. Het kan een kolomalias gebruiken voor een afgeleide tabel die in de FROM component is gedefinieerd.
  • Een GROUP BY kolomuitdrukking kan geen kolom van typetekst, ntext of afbeelding bevatten. U kunt echter een kolom met tekst, ntext of afbeelding gebruiken als argument voor een functie die een waarde van een geldig gegevenstype retourneert. De expressie kan bijvoorbeeld worden gebruikt SUBSTRING() en CAST(). Deze regel is ook van toepassing op expressies in de HAVING component.
  • Een GROUP BY kolomexpressie kan geen xml-datatypemethode bevatten. Het kan een door de gebruiker gedefinieerde functie bevatten of een berekende kolom die xml-datatypemethoden gebruikt.
  • Een GROUP BY kolomexpressie kan geen subquery bevatten; de query geeft fout 144 terug.
  • Een GROUP BY kolomexpressie kan geen kolom uit een geïndexeerde weergave bevatten.

De volgende instructies zijn toegestaan:

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;

De volgende instructies zijn niet toegestaan:

SELECT ColumnA,
       ColumnB
FROM T
GROUP BY ColumnA + ColumnB;

SELECT ColumnA + constant + ColumnB
FROM T
GROUP BY ColumnA + ColumnB;

GROEPEREN OP ALLES

Van toepassing op: Fabric Data Warehouse en SQL analytics endpoint

Groepeert rijen in een query door alle niet-geaggregeerde expressies in de SELECT lijst, zonder dat je ze expliciet in de GROUP BY <columns> clausule hoeft te vermelden.

GROUP BY ALL Vereenvoudigt aggregate queries door automatisch te groeperen op elke geselecteerde kolom die geen deel uitmaakt van een aggregate functie.

Deze GROUP BY ALL syntaxis geldt alleen voor Fabric Data Warehouse en het SQL-analyse-eindpunt. Deze GROUP BY ALL syntaxis is momenteel niet beschikbaar in SQL Server, Azure SQL Database, Azure SQL Managed Instance of SQL database in Fabric. Voor die platforms gebruik je de kolomuitdrukkingssyntaxis GROUP BY ALL.

  • GROUP BY ALL identificeert alle expressies in de SELECT lijst.
  • GROUP BY ALL sluit expressies uit die in aggregate functies zijn verpakt.
  • GROUP BY ALL groeperen door alle overige uitdrukkingen.
  • GROUP BY ALL verandert de query-semantiek niet—alleen de syntaxis. Het toevoegen van een nieuwe niet-geaggregeerde kolom aan de SELECT lijst beïnvloedt automatisch de groepering.

In tegenstelling tot een expliciete GROUP BY <columns> clausule, die een fout veroorzaakt als een geselecteerde kolom niet in de groeperingssleutels is opgenomen, GROUP BY ALL voegt automatisch alle niet-geaggregeerde kolommen uit de SELECT lijst toe aan de groepsset. Deze aanpak voorkomt de Column is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause fout.

Warning

Het toevoegen van veel kolommen aan de groeperingsset kan de queryprestaties negatief beïnvloeden.

Als je nauwkeurige controle over groeperingssleutels nodig hebt, gebruik dan een expliciete clausule GROUP BY <columns> en projecteer extra niet-geaggregeerde kolommen door een lichtgewicht aggregatefunctie toe te passen, zoals ANY_VALUE.

Het volgende voorbeeld laat zien hoe je met dezelfde dataset als de GROUP BY <columns> voorbeelden kunt gebruiken GROUP BY ALL om het vergemakkelijken om gedrag en resultaten te vergelijken.

SELECT
    Region,
    Territory,
    SUM(Sales) AS TotalSales
FROM Sales
GROUP BY ALL;

GROUP BY ALL impliciet groeperen ze met Region en Territory omdat zij de enige niet-aggregeerde uitdrukkingen in de SELECT lijst zijn.

Het queryresultaat heeft drie rijen omdat er drie combinaties van waarden voor Region en Territory. De TotalSales voor Canada en Brits-Columbia is de som van twee rijen.

Region Rayon TotalSales
Canada Alberta 100
Canada Brits-Columbia 500
Verenigde Staten Montana 100

Dit gedrag is functioneel gelijkwaardig aan het expliciet opsommen van alle niet-geaggregeerde kolommen in de GROUP BY clausule.

GROEPEREN OP ROLLUP ()

Hiermee maakt u een groep voor elke combinatie van kolomexpressies. Daarnaast worden de resultaten samengevoegd tot subtotalen en eindtotalen. Wanneer de groepen worden gemaakt, wordt deze verplaatst van rechts naar links, waardoor het aantal kolomexpressies voor groepering en aggregaties wordt verkleind.

De kolomvolgorde is van invloed op de ROLLUP uitvoer en kan van invloed zijn op het aantal rijen in de resultatenset.

Maakt bijvoorbeeld GROUP BY ROLLUP (col1, col2, col3, col4) groepen voor elke combinatie van kolomexpressies in de volgende lijsten:

  • Col1, Col2, Col3, Col4
  • kolom1, kolom 2, kolom 3, NULL
  • kolom1, kolom2, NULL, NULL
  • KOL1, NULL, NULL, NULL
  • NULL, NULL, NULL, NULL (de groep met de NULL waarden is het eindtotaal)

Met behulp van de tabel uit het vorige voorbeeld wordt met deze code een GROUP BY ROLLUP bewerking uitgevoerd in plaats van een basisbewerking GROUP BY.

SELECT Region,
       Territory,
       SUM(Sales) AS TotalSales
FROM Sales
GROUP BY ROLLUP(Region, Territory);

Het queryresultaat heeft dezelfde aggregaties als de basis GROUP BY zonder de ROLLUP. Daarnaast worden er subtotalen gemaakt voor elke waarde van Regio. Ten slotte geeft het een eindtotaal voor alle rijen. Het resultaat ziet er als volgt uit:

Region Rayon TotalSales
Canada Alberta 100
Canada Brits-Columbia 500
Canada NULL 600
Verenigde Staten Montana 100
Verenigde Staten NULL 100
NULL NULL 700

GROEPEREN OP KUBUS ()

GROUP BY CUBE maakt groepen voor alle mogelijke combinaties van kolommen. Voor GROUP BY CUBE (a, b), de resultaten hebben groepen voor unieke waarden van (a, b), (NULL, b), en (a, NULL)(NULL, NULL).

Met behulp van de tabel uit de vorige voorbeelden wordt met deze code een GROUP BY CUBE bewerking uitgevoerd op Regio en Gebied.

SELECT Region,
       Territory,
       SUM(Sales) AS TotalSales
FROM Sales
GROUP BY CUBE(Region, Territory);

Het queryresultaat bevat groepen voor unieke waarden van (Region, Territory), (NULL, Territory), (Region, NULL)en (NULL, NULL). De resultaten zien er als volgt uit:

Region Rayon TotalSales
Canada Alberta 100
NULL Alberta 100
Canada Brits-Columbia 500
NULL Brits-Columbia 500
Verenigde Staten Montana 100
NULL Montana 100
NULL NULL 700
Canada NULL 600
Verenigde Staten NULL 100

GROEPEREN OP GROEPERINGSSETS ()

Met de GROUPING SETS optie worden meerdere GROUP BY componenten gecombineerd tot één GROUP BY component. De resultaten zijn hetzelfde als het gebruik van UNION ALL de opgegeven groepen.

U kunt bijvoorbeeld GROUP BY ROLLUP (Region, Territory)GROUP BY GROUPING SETS ( ROLLUP (Region, Territory)) dezelfde resultaten retourneren.

Wanneer GROUPING SETS twee of meer elementen zijn, zijn de resultaten een samenvoeging van de elementen. In dit voorbeeld wordt de samenvoeging van de ROLLUP en CUBE resultaten voor Regio en Gebied geretourneerd.

SELECT Region,
       Territory,
       SUM(Sales) AS TotalSales
FROM Sales
GROUP BY GROUPING SETS(ROLLUP(Region, Territory), CUBE(Region, Territory));

De resultaten zijn hetzelfde als deze query die een samenvoeging van de twee GROUP BY instructies retourneert.

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);

IN SQL worden geen dubbele groepen geconsolideerd die zijn gegenereerd voor een GROUPING SETS lijst. In beide elementen wordt bijvoorbeeld GROUP BY ((), CUBE (Region, Territory))een rij voor het eindtotaal geretourneerd en worden beide rijen weergegeven in de resultaten.

Ondersteuning voor FUNCTIES VAN ISO en ANSI SQL-2006 GROUP BY

De GROUP BY component ondersteunt alle GROUP BY functies die zijn opgenomen in de SQL-2006-standaard met de volgende syntaxis-uitzonderingen:

  • Groeperingssets zijn niet toegestaan in de GROUP BY component, tenzij ze deel uitmaken van een expliciete GROUPING SETS lijst. Is bijvoorbeeld GROUP BY Column1, (Column2, ...ColumnN) toegestaan in de standaard, maar niet in Transact-SQL. Transact-SQL ondersteunt GROUP BY C1, GROUPING SETS ((Column2, ...ColumnN)) en GROUP BY Column1, Column2, ... ColumnN, die semantisch gelijkwaardig zijn. Deze componenten zijn semantisch gelijk aan het vorige GROUP BY voorbeeld. Deze beperking voorkomt de mogelijkheid dat GROUP BY Column1, (Column2, ...ColumnN) verkeerd kan worden geïnterpreteerd als GROUP BY C1, GROUPING SETS ((Column2, ...ColumnN)), die niet semantisch gelijkwaardig zijn.

  • Groeperingssets zijn niet toegestaan in groepeersets. Is bijvoorbeeld GROUP BY GROUPING SETS (A1, A2,...An, GROUPING SETS (C1, C2, ...Cn)) toegestaan in de SQL-2006-standaard, maar niet in Transact-SQL. Transact-SQL staat GROUP BY GROUPING SETS( A1, A2,...An, C1, C2, ...Cn) toe of GROUP BY GROUPING SETS( (A1), (A2), ... (An), (C1), (C2), ... (Cn)), die semantisch gelijk zijn aan het eerste GROUP BY voorbeeld en hebben duidelijkere syntaxis.

GROEP DOOR ()

Hiermee geeft u de lege groep op, waarmee het eindtotaal wordt gegenereerd. Deze groep is handig als een van de elementen van een GROUPING SET. Deze instructie geeft bijvoorbeeld de totale verkoop voor elke regio en geeft vervolgens het eindtotaal voor alle regio's.

SELECT Region,
       SUM(Sales) AS TotalSales
FROM Sales
GROUP BY GROUPING SETS(Region, ());

GROUP BY ALL column-expression [ ,... n ]

Van toepassing op: SQL Server, Azure SQL Database, Azure SQL Managed Instance en SQL database in Fabric

Note

Gebruik deze syntaxis alleen voor compatibiliteit met eerdere versies. Vermijd het gebruik van deze syntaxis in nieuwe ontwikkelwerkzaamheden en plan om toepassingen te wijzigen die momenteel deze syntaxis gebruiken.

De GROUP BY ALL T-SQL-syntaxis is anders in Fabric Data Warehouse. Voor de Fabric Data Warehouse versie van dit artikel, zie SELECTEER - GROEPEREN OP voor Fabric Data Warehouse.

Hiermee geeft u op of alle groepen in de resultaten moeten worden opgenomen, ongeacht of ze voldoen aan de zoekcriteria in de WHERE component. Groepen die niet voldoen aan de zoekcriteria voor NULL de aggregatie.

  • GROUP BY ALL {columns} wordt niet ondersteund in queries die toegang krijgen tot externe tabellen als er ook een WHERE clausule in de query zit.
  • GROUP BY ALL {columns} faalt op kolommen die het attribuut FILESTREAM hebben.

Ondersteuning voor FUNCTIES VAN ISO en ANSI SQL-2006 GROUP BY

De GROUP BY component ondersteunt alle GROUP BY functies die zijn opgenomen in de SQL-2006-standaard met de volgende syntaxis-uitzonderingen:

  • U kunt alleen een basiscomponent GROUP BY ALL gebruiken GROUP BY DISTINCT die GROUP BY kolomexpressies bevat. U kunt ze niet gebruiken met de GROUPING SETSconstructies , of ROLLUPCUBEWITH CUBEWITH ROLLUP de . ALL is de standaardinstelling en is impliciet. U kunt deze alleen gebruiken in de achterwaarts compatibele syntaxis.

GROUP BY column-expression [ ,... n ] MET { KUBUS | ROLLUP }

Van toepassing op: SQL Server, Azure SQL Database, Azure SQL Managed Instance en SQL database in Fabric

De legacy GROUP BY <column-expression> WITH CUBE en GROUP BY <column-expression> WITH ROLLUP syntax worden alleen ondersteund voor achterwaartse compatibiliteit.

Note

Gebruik deze syntaxis alleen voor compatibiliteit met eerdere versies. Vermijd het gebruik van deze syntaxis in nieuwe ontwikkelwerkzaamheden en plan om toepassingen te wijzigen die momenteel deze syntaxis gebruiken.

MET (DISTRIBUTED_AGG)

van toepassing op: Azure Synapse Analytics

De DISTRIBUTED_AGG query hint wordt niet ondersteund in SQL Server, Azure SQL Database, Azure SQL Managed Instance, SQL-databases in Fabric of Fabric Data Warehouse.

De DISTRIBUTED_AGG queryhint dwingt het MPP-systeem (Massively Parallel Processing) af om een tabel opnieuw te distribueren in een specifieke kolom voordat een aggregatie wordt uitgevoerd. U kunt de DISTRIBUTED_AGG queryhint slechts op één kolom in de GROUP BY component gebruiken. Nadat de query is voltooid, wordt de opnieuw gedistribueerde tabel verwijderd. De oorspronkelijke tabel wordt niet gewijzigd.

Note

De DISTRIBUTED_AGG query hint biedt achterwaartse compatibiliteit en verbetert de prestaties voor de meeste queries niet. Standaard worden met MPP al gegevens herdistribueerd als dat nodig is om de prestaties voor aggregaties te verbeteren.

Opmerkingen

Hoe GROUP BY communiceert met de SELECT-instructie

SELECT Lijst:

  • Vectoraggregaten. Als u statistische functies in de SELECT lijst opneemt, GROUP BY berekent u een samenvattingswaarde voor elke groep. Deze functies worden vectoraggregaties genoemd.
  • Verschillende aggregaten. De aggregaties AVG(DISTINCT <column_name>), COUNT(DISTINCT <column_name>)en SUM(DISTINCT <column_name>) werken met ROLLUP, CUBEen GROUPING SETS.

WHERE clausule:

  • SQL verwijdert rijen die niet voldoen aan de voorwaarden in de WHERE component voordat er een groeperingsbewerking wordt uitgevoerd.

HAVING clausule:

  • SQL gebruikt de HAVING component om groepen in de resultatenset te filteren.

ORDER BY clausule:

  • Gebruik de ORDER BY component om de resultatenset te orden. Met GROUP BY de component wordt de resultatenset niet gesorteerd.

NULL waarden:

  • Als een groepeerkolom waarden bevat NULL , worden alle NULL waarden door de database-engine als gelijk behandeld en verzameld in één groep.

Beperkingen

Van toepassing op: SQL Server en Azure Synapse Analytics

Voor een GROUP BY component die gebruikmaakt ROLLUPvan , CUBEof GROUPING SETS, is het maximum aantal expressies 32. Het maximum aantal groepen is 4.096 (212). De volgende voorbeelden mislukken omdat de GROUP BY component meer dan 4096 groepen heeft.

  • In het volgende voorbeeld worden 4.097 (212 + 1) groeperingssets gegenereerd en mislukt.

    GROUP BY GROUPING SETS( CUBE(a1, ..., a12), b)
    
  • In het volgende voorbeeld worden 4.097 (212 + 1) groepen gegenereerd en mislukt. Zowel CUBE () als de () groeperingsset produceren een eindtotaalrij en dubbele groeperingssets worden niet geëlimineerd.

    GROUP BY GROUPING SETS( CUBE(a1, ..., a12), ())
    
  • In dit voorbeeld wordt de achterwaarts compatibele syntaxis gebruikt. Er worden 8.192 (213) groeperingssets gegenereerd en mislukt.

    GROUP BY CUBE (a1, ..., a13)
    GROUP BY a1, ..., a13 WITH CUBE
    

    Voor achterwaarts compatibele GROUP BY componenten die geen kolomgrootten, de samengevoegde kolommen en de cumulatieve waarden in de query bevatten CUBEROLLUPGROUP BY, beperken het aantal GROUP BY items. Deze limiet is afkomstig van de limiet van 8060 bytes op de tussenliggende werktabel met tussenliggende queryresultaten. U kunt maximaal 12 groeperingsexpressies gebruiken wanneer u opgeeft CUBE of ROLLUP.

Vergelijking van ondersteunde GROUP BY-functies

In de volgende tabel worden de GROUP BY functies beschreven die door verschillende producten worden ondersteund.

Feature SQL Server Integration Services SQL Server 1
DISTINCT Aggregaten Niet ondersteund voor WITH CUBE of WITH ROLLUP. Ondersteund voorWITH CUBE, WITH ROLLUP, GROUPING SETS, of CUBEROLLUP.
Door de gebruiker gedefinieerde functie met CUBE of ROLLUP naam in de GROUP BY component Door de gebruiker gedefinieerde functie dbo.cube(<arg1>, ...<argN>) of dbo.rollup(<arg1>, ...<argN>) in de GROUP BY component is toegestaan.

Bijvoorbeeld: SELECT SUM (x) FROM T GROUP BY dbo.cube(y);
Door de gebruiker gedefinieerde functie dbo.cube (<arg1>, ...<argN>) of dbo.rollup(<arg1>, ...<argN>) in de GROUP BY component is niet toegestaan.

Bijvoorbeeld: SELECT SUM (x) FROM T GROUP BY dbo.cube(y);

SQL Server retourneert een foutbericht 2.

Om dit probleem te voorkomen, vervangt dbo.cube u door [dbo].[cube] of dbo.rollup door [dbo].[rollup].

Het volgende voorbeeld is toegestaan: SELECT SUM (x) FROM T GROUP BY [dbo].[cube](y);
GROUPING SETS Niet ondersteund Supported
CUBE Niet ondersteund Supported
ROLLUP Niet ondersteund Supported
Eindtotaal, zoals GROUP BY() Niet ondersteund Supported
GROUPING_ID functie Niet ondersteund Supported
GROUPING functie Supported Supported
WITH CUBE Supported Supported
WITH ROLLUP Supported Supported
WITH CUBE of WITH ROLLUP 'dubbele' groepering verwijderen Supported Supported

1Databasecompatibiliteitsniveau 100 en hoger.

2 Het geretourneerde foutbericht is: Incorrect syntax near the keyword 'cube'|'rollup'.

Examples

De codevoorbeelden in dit artikel gebruiken de AdventureWorks2025 of AdventureWorksDW2025 voorbeelddatabase, die je kunt downloaden van de Azure Data SQL Samples Repository GitHub-repository.

A. Een basic GROUP BY-component gebruiken

In het volgende voorbeeld wordt het totaal voor elk SalesOrderID uit de SalesOrderDetail tabel opgehaald. In dit voorbeeld wordt AdventureWorks gebruikt.

SELECT SalesOrderID,
       SUM(LineTotal) AS SubTotal
FROM Sales.SalesOrderDetail AS sod
GROUP BY SalesOrderID
ORDER BY SalesOrderID;

B. Een GROUP BY-component gebruiken met meerdere tabellen

In het volgende voorbeeld wordt het aantal werknemers voor elke City werknemer opgehaald uit de Address tabel die aan de EmployeeAddress tabel is gekoppeld. In dit voorbeeld wordt AdventureWorks gebruikt.

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. Een GROUP BY-component gebruiken met een expressie

In het volgende voorbeeld wordt de totale verkoop voor elk jaar opgehaald met behulp van de DATEPART functie. U moet dezelfde expressie opnemen in zowel de lijst als SELECT de GROUP BY component.

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. Een GROUP BY-component gebruiken met een HAVING-component

In het volgende voorbeeld wordt de HAVING component gebruikt om op te geven welke groepen die in de GROUP BY component zijn gegenereerd, moeten worden opgenomen in de resultatenset.

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);

Voorbeelden: Azure Synapse Analytics

E. Basisgebruik van de GROUP BY-component

In het volgende voorbeeld wordt het totale bedrag voor alle verkopen per dag gevonden. De query retourneert één rij met de som van alle verkopen voor elke dag.

-- Uses AdventureWorksDW
SELECT OrderDateKey,
       SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY OrderDateKey
ORDER BY OrderDateKey;

F. Basisgebruik van de DISTRIBUTED_AGG hint

In dit voorbeeld wordt de DISTRIBUTED_AGG queryhint gebruikt om te forceren dat het apparaat de tabel in de CustomerKey kolom schuift voordat de aggregatie wordt uitgevoerd.

-- Uses AdventureWorksDW
SELECT CustomerKey,
       SUM(SalesAmount) AS sas
FROM FactInternetSales
GROUP BY CustomerKey WITH(DISTRIBUTED_AGG)
ORDER BY CustomerKey DESC;

G. Syntaxisvariaties voor GROUP BY

Wanneer de selectielijst geen aggregaties heeft, moet u elke kolom in de selectielijst in de GROUP BY lijst opnemen. U kunt berekende kolommen opnemen in de selectielijst, maar u hoeft ze niet in de GROUP BY lijst op te nemen. In deze voorbeelden worden syntactisch geldige SELECT instructies weergegeven:

-- 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. Een GROUP BY-component gebruiken met meerdere GROUP BY-expressies

In het volgende voorbeeld worden resultaten gegroepeerd met behulp van meerdere GROUP BY criteria. Als binnen elke OrderDateKey groep subgroepen bestaan die onderscheid maken tussen de DueDateKey waarde, definieert de query een nieuwe groepering voor de resultatenset.

-- Uses AdventureWorks
SELECT OrderDateKey,
       DueDateKey,
       SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY OrderDateKey, DueDateKey
ORDER BY OrderDateKey;

I. Een GROUP BY-component gebruiken met een HAVING-component

In het volgende voorbeeld wordt de HAVING component gebruikt om de groepen op te geven die zijn gegenereerd in de GROUP BY component die moeten worden opgenomen in de resultatenset. Alleen groepen met orderdatums in 2004 of hoger worden opgenomen in de resultaten.

-- Uses AdventureWorks
SELECT OrderDateKey,
       SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY OrderDateKey
HAVING OrderDateKey > 20040000
ORDER BY OrderDateKey;