Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
SQL Analytics-eindpunt in Microsoft Fabric
Magazijn in Microsoft Fabric
SQL-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 eenUNION ALLvan meerdereGROUP BYquery's, maar samen geoptimaliseerd.() (lege groeperingsset)
Afkorting voor het berekenen van alleen het eindtotaal voor alle rijen. Gebruik het alleen als
GROUP BY ()of binnenGROUPING 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(...)ofGROUP 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 BYkolomexpressie kan geen kolomalias bevatten die je in deSELECTlijst definieert. Het kan een kolomalias gebruiken voor een afgeleide tabel die in deFROMcomponent is gedefinieerd. - Een
GROUP BYkolomuitdrukking 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 gebruiktSUBSTRING()enCAST(). Deze regel is ook van toepassing op expressies in deHAVINGcomponent. - Een
GROUP BYkolomexpressie kan geen xml-datatypemethode bevatten. Het kan een door de gebruiker gedefinieerde functie bevatten of een berekende kolom die xml-datatypemethoden gebruikt. - Een
GROUP BYkolomexpressie kan geen subquery bevatten; de query geeft fout 144 terug. - Een
GROUP BYkolomexpressie 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 ALLidentificeert alle expressies in deSELECTlijst. -
GROUP BY ALLsluit expressies uit die in aggregate functies zijn verpakt. -
GROUP BY ALLgroeperen door alle overige uitdrukkingen. -
GROUP BY ALLverandert de query-semantiek niet—alleen de syntaxis. Het toevoegen van een nieuwe niet-geaggregeerde kolom aan deSELECTlijst 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
NULLwaarden 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 BYcomponent, tenzij ze deel uitmaken van een explicieteGROUPING SETSlijst. Is bijvoorbeeldGROUP BY Column1, (Column2, ...ColumnN)toegestaan in de standaard, maar niet in Transact-SQL. Transact-SQL ondersteuntGROUP BY C1, GROUPING SETS ((Column2, ...ColumnN))enGROUP BY Column1, Column2, ... ColumnN, die semantisch gelijkwaardig zijn. Deze componenten zijn semantisch gelijk aan het vorigeGROUP BYvoorbeeld. Deze beperking voorkomt de mogelijkheid datGROUP BY Column1, (Column2, ...ColumnN)verkeerd kan worden geïnterpreteerd alsGROUP 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 staatGROUP BY GROUPING SETS( A1, A2,...An, C1, C2, ...Cn)toe ofGROUP BY GROUPING SETS( (A1), (A2), ... (An), (C1), (C2), ... (Cn)), die semantisch gelijk zijn aan het eersteGROUP BYvoorbeeld 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 eenWHEREclausule 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 ALLgebruikenGROUP BY DISTINCTdieGROUP BYkolomexpressies bevat. U kunt ze niet gebruiken met deGROUPING SETSconstructies , ofROLLUPCUBEWITH CUBEWITH ROLLUPde .ALLis 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
SELECTlijst opneemt,GROUP BYberekent u een samenvattingswaarde voor elke groep. Deze functies worden vectoraggregaties genoemd. - Verschillende aggregaten. De aggregaties
AVG(DISTINCT <column_name>),COUNT(DISTINCT <column_name>)enSUM(DISTINCT <column_name>)werken metROLLUP,CUBEenGROUPING SETS.
WHERE clausule:
- SQL verwijdert rijen die niet voldoen aan de voorwaarden in de
WHEREcomponent voordat er een groeperingsbewerking wordt uitgevoerd.
HAVING clausule:
- SQL gebruikt de
HAVINGcomponent om groepen in de resultatenset te filteren.
ORDER BY clausule:
- Gebruik de
ORDER BYcomponent om de resultatenset te orden. MetGROUP BYde component wordt de resultatenset niet gesorteerd.
NULL waarden:
- Als een groepeerkolom waarden bevat
NULL, worden alleNULLwaarden 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 CUBEVoor achterwaarts compatibele
GROUP BYcomponenten die geen kolomgrootten, de samengevoegde kolommen en de cumulatieve waarden in de query bevattenCUBEROLLUPGROUP BY, beperken het aantalGROUP BYitems. 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 opgeeftCUBEofROLLUP.
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;
Verwante inhoud
- GROUPING_ID (Transact-SQL)
- GROEPERING (Transact-SQL)
- SELECT (Transact-SQL)
- SELECT-component (Transact-SQL)