Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
SQL-analysendpoint i Microsoft Fabric
Lager i Microsoft Fabric
SQL-databas i Microsoft Fabric
En SELECT instruktionssats som delar upp frågeresultatet i grupper med rader, vanligtvis genom att utföra en eller flera aggregeringar i varje grupp. Instruktionen SELECT returnerar en rad för varje grupp.
Den här artikeln innehåller olika syntax, argument, kommentarer, behörigheter och exempel baserat på den valda produktversionen. Välj önskad produktversion i listrutan version.
Syntax
Transact-SQL syntaxkonventioner
ISO-kompatibel syntax för SQL Server, Azure SQL Database, Azure SQL Managed Instance och 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 ] )
Syntax som inte är ISO-kompatibel endast för bakåtkompatibilitet:
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 Fabric Data Warehouse och SQL-analysendpoint:
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
Kolumnuttryck
Anger en kolumn eller en icke-aggregeringsberäkning för en kolumn. Den här kolumnen kan tillhöra en tabell, härledd tabell eller vy. Kolumnen måste visas i FROM instruktionens SELECT sats, men behöver inte visas i SELECT listan.
Giltiga uttryck finns i uttrycket.
Kolumnen måste visas i FROM instruktionens SELECT sats, men krävs inte för att visas i SELECT listan. Du måste dock inkludera varje tabell eller vykolumn i GROUP BY listan om du använder den i ett icke-aggregeringsuttryck i <select> listan.
ALTERNATIV FÖR GRUPPERA EFTER
Följande alternativ utökar den grundläggande GROUP BY satsen för att stödja hierarkisk aggregering, flerdimensionell sammanfattning, anpassade grupperingskombinationer och plattformsspecifika körningsbeteenden. Frågor kan använda dessa alternativ för att producera delsummor och totalsummor i en enda logisk åtgärd.
ROLLUP ( <group_by_expression> [ , ... n ] )
Genererar hierarkiska delsummor för de listade kolumnerna och en slutlig totalsumma (till exempel
(a,b,c),(a,b),(a),()). Använd den för att öka detaljnivån, till exempelkvartalsmånad>för år>.CUBE ( <group_by_expression> [ , ... n ] )
Genererar alla kombinationer av de angivna kolumnerna (hela 2^n-lattice) plus totalsumman. Använd den för flerdimensionell analys i varje sektor.
GRUPPERINGSUPPSÄTTNINGAR ( <grouping_set> [ , ... n ] )
Definierar de exakta grupperingar som ska beräknas (inklusive
()för totalsumma) i ett enda pass. Det här alternativet liknar funktionellt fleraUNION ALLGROUP BYfrågor men optimeras tillsammans.() (tom grupperingsuppsättning)
Förkortning för att endast beräkna totalsumman för alla rader. Använd den ensam som
GROUP BY ()eller inutiGROUPING SETS.ALLA kolumnuttryck [ , ... n ](icke-ISO; bakåtkompatibilitet)
Kort stavning för att gruppera efter alla objekt som inte är aggregerade. Behålls för kompatibilitet; tillgänglighet och semantik varierar.
column-expression [ , ... n ] MED { KUB | 'SAMMANSLAGNING }(äldre formulär)
Äldre, icke-ISO-syntax som motsvarar
GROUP BY CUBE(...)ellerGROUP BY ROLLUP(...). Stöds endast för bakåtkompatibilitet. Använd ISO-underklienterna när det är möjligt.MED (DISTRIBUTED_AGG)
Tips distribuerad körning för sammansättningar vid gruppering efter en enda kolumn. Endast Azure Synapse Analytics dedikerade SQL-pools stöder detta alternativ.
GROUP BY column-expression [ ,... n ]
Grupperar -instruktionens SELECT resultat enligt värdena i en lista med ett eller flera kolumnuttryck.
Den här frågan skapar till exempel en Sales tabell med kolumner för Region, Territoryoch Sales. Den infogar fyra rader och två av raderna har matchande värden för Region och 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);
Tabellen Sales innehåller följande rader:
| Region | Område | Sales |
|---|---|---|
| Canada | Alberta | 100 |
| Canada | British Columbia | 200 |
| Canada | British Columbia | 300 |
| United States | Montana | 100 |
Nästa fråga grupperar Region och Territory returnerar den aggregerade summan för varje kombination av värden.
SELECT Region,
Territory,
SUM(sales) AS TotalSales
FROM Sales
GROUP BY Region, Territory;
Frågeresultatet har tre rader eftersom det finns tre kombinationer av värden för Region och Territory.
TotalSales För Kanada och British Columbia är summan av två rader.
| Region | Område | TotalSales |
|---|---|---|
| Canada | Alberta | 100 |
| Canada | British Columbia | 500 |
| United States | Montana | 100 |
Kolumnuttrycket i GROUP BY kan inte innehålla följande element:
- Ett
GROUP BYkolumnuttryck kan inte innehålla ett kolumnalias som du definierar i listanSELECT. Den kan använda ett kolumnalias för en härledd tabell som definieras iFROM-satsen. - Ett
GROUP BYkolumnuttryck kan inte innehålla en kolumn med typtext, ntext eller bild. Du kan dock använda en kolumn med text, ntext eller bild som ett argument till en funktion som returnerar ett värde av en giltig datatyp. Uttrycket kan till exempel användaSUBSTRING()ochCAST(). Den här regeln gäller även för uttryck iHAVING-satsen. - Ett
GROUP BYkolumnuttryck kan inte innehålla en xml-datatypmetod . Den kan inkludera en användardefinierad funktion eller en beräknad kolumn som använder xml-datatypmetoder . - Ett
GROUP BYkolumnuttryck kan inte innehålla en delfråga; frågan ger fel 144. - Ett
GROUP BYkolumnuttryck kan inte innehålla en kolumn från en indexerad vy.
Följande instruktioner är tillåtna:
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;
Följande instruktioner är inte tillåtna:
SELECT ColumnA,
ColumnB
FROM T
GROUP BY ColumnA + ColumnB;
SELECT ColumnA + constant + ColumnB
FROM T
GROUP BY ColumnA + ColumnB;
GRUPPERA EFTER ALLA
Gäller för: Fabric Data Warehouse och SQL-analysendpoint
Grupperar rader i en fråga efter alla icke-aggregerade uttryck i listan SELECT , utan att du behöver lista dem uttryckligen i klausulen GROUP BY <columns> .
GROUP BY ALL Förenklar aggregerade frågor genom att automatiskt gruppera på varje vald kolumn som inte ingår i en aggregerad funktion.
Denna GROUP BY ALL syntax gäller endast för Fabric Data Warehouse och SQL-analysändpunkten. Denna GROUP BY ALL syntax är för närvarande inte tillgänglig i SQL Server, Azure SQL Database, Azure SQL Managed Instance eller SQL database in Fabric. För dessa plattformar, använd kolumnuttryckssyntaxen GROUP BY ALL.
-
GROUP BY ALLidentifierar alla uttryck i listanSELECT. -
GROUP BY ALLexkluderar uttryck inlindade i aggregerade funktioner. -
GROUP BY ALLgrupperar med alla återstående uttryck. -
GROUP BY ALLändrar inte frågesemantiken—endast syntaxen. Att lägga till en ny icke-aggregerad kolumn iSELECTlistan påverkar automatiskt grupperingen.
Till skillnad från en explicit GROUP BY <columns> klausul, som ger ett fel om en vald kolumn inte ingår i grupperingsnycklarna, GROUP BY ALL lägger automatiskt till alla icke-aggregerade kolumner från SELECT listan i grupperingsmängden. Denna metod undviker Column is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause felet.
Varning
Att lägga till många kolumner i grupperingsuppsättningen kan påverka frågeprestandan negativt.
Om du behöver exakt kontroll över grupperingsnycklar, använd en explicit GROUP BY <columns> klausul och projicera ytterligare icke-aggregerade kolumner genom att tillämpa en lättviktig aggregerad funktion som ANY_VALUE.
Följande exempel visar hur man kan använda GROUP BY ALL samma datamängd som exemplen GROUP BY <columns> för att göra det enklare att jämföra beteende och resultat.
SELECT
Region,
Territory,
SUM(Sales) AS TotalSales
FROM Sales
GROUP BY ALL;
GROUP BY ALL implicit grupperas med Region och Territory eftersom de är de enda icke-aggregerade uttrycken i SELECT listan.
Frågeresultatet har tre rader eftersom det finns tre kombinationer av värden för Region och Territory.
TotalSales För Kanada och British Columbia är summan av två rader.
| Region | Område | TotalSales |
|---|---|---|
| Canada | Alberta | 100 |
| Canada | British Columbia | 500 |
| United States | Montana | 100 |
Detta beteende är funktionellt likvärdigt med att explicit lista alla icke-aggregerade kolumner i klausulen GROUP BY .
GRUPPERA EFTER SAMMANSLAGNING ()
Skapar en grupp för varje kombination av kolumnuttryck. Dessutom summeras resultatet i delsummor och totalsummor. När grupperna skapas flyttas de från höger till vänster, vilket minskar antalet kolumnuttryck för gruppering och sammansättningar.
Kolumnordningen ROLLUP påverkar utdata och kan påverka antalet rader i resultatuppsättningen.
Skapar till exempel GROUP BY ROLLUP (col1, col2, col3, col4) grupper för varje kombination av kolumnuttryck i följande listor:
- kol1, kol2, kol 3, kol 4
- kol1, kol2, kol3, NULL
- kol1, kol2, NULL, NULL
- kol1, NULL, NULL, NULL
- NULL, NULL, NULL, NULL (Gruppen med
NULLvärdena är totalsumman)
Med hjälp av tabellen från föregående exempel kör den här koden en GROUP BY ROLLUP åtgärd i stället för en grundläggande GROUP BY.
SELECT Region,
Territory,
SUM(Sales) AS TotalSales
FROM Sales
GROUP BY ROLLUP(Region, Territory);
Frågeresultatet har samma sammansättningar som grundläggande GROUP BY utan ROLLUP. Dessutom skapas delsummor för varje värde i Region. Slutligen ger den en totalsumma för alla rader. Resultatet ser ut så här:
| Region | Område | TotalSales |
|---|---|---|
| Canada | Alberta | 100 |
| Canada | British Columbia | 500 |
| Canada | NULL | 600 |
| United States | Montana | 100 |
| United States | NULL | 100 |
| NULL | NULL | 700 |
GRUPPERA EFTER KUB ()
GROUP BY CUBE skapar grupper för alla möjliga kombinationer av kolumner. För GROUP BY CUBE (a, b)har resultaten grupper för unika värden för (a, b), (NULL, b), (a, NULL)och (NULL, NULL).
Med hjälp av tabellen från föregående exempel kör den här koden en GROUP BY CUBE åtgärd i Region och Område.
SELECT Region,
Territory,
SUM(Sales) AS TotalSales
FROM Sales
GROUP BY CUBE(Region, Territory);
Frågeresultatet har grupper för unika värden för (Region, Territory), (NULL, Territory), (Region, NULL)och (NULL, NULL). Resultatet ser ut så här:
| Region | Område | 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 |
GRUPPERA EFTER GRUPPERINGSUPPSÄTTNINGAR ()
Alternativet GROUPING SETS kombinerar flera GROUP BY satser i en GROUP BY sats. Resultatet är detsamma som för UNION ALL de angivna grupperna.
Till exempel GROUP BY ROLLUP (Region, Territory) och GROUP BY GROUPING SETS ( ROLLUP (Region, Territory)) returnera samma resultat.
När GROUPING SETS har två eller flera element är resultatet en union av elementen. Det här exemplet returnerar union av ROLLUP resultaten och CUBE för Region och Område.
SELECT Region,
Territory,
SUM(Sales) AS TotalSales
FROM Sales
GROUP BY GROUPING SETS(ROLLUP(Region, Territory), CUBE(Region, Territory));
Resultatet är samma som den här frågan som returnerar en union av de två GROUP BY uttrycken.
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 konsoliderar inte duplicerade grupper som genererats för en GROUPING SETS lista. I returnerar till exempel GROUP BY ((), CUBE (Region, Territory))båda elementen en rad för totalsumman och båda raderna visas i resultatet.
Stöd för ISO- och ANSI SQL-2006 GROUP BY-funktioner
GROUP BY Satsen stöder alla GROUP BY funktioner som ingår i SQL-2006-standarden med följande syntaxfel:
Grupperingsuppsättningar tillåts inte i satsen om de inte ingår i
GROUP BYen explicitGROUPING SETSlista. Till exempel tillåts i standarden menGROUP BY Column1, (Column2, ...ColumnN)inte i Transact-SQL. Transact-SQL stöderGROUP BY C1, GROUPING SETS ((Column2, ...ColumnN))ochGROUP BY Column1, Column2, ... ColumnN, som är semantiskt likvärdiga. Dessa satser är semantiskt likvärdiga med föregåendeGROUP BYexempel. Den här begränsningen undviker möjligheten attGROUP BY Column1, (Column2, ...ColumnN)feltolkas somGROUP BY C1, GROUPING SETS ((Column2, ...ColumnN)), som inte är semantiskt likvärdiga.Grupperingsuppsättningar tillåts inte i grupperingsuppsättningar. Till exempel tillåts i SQL-2006-standarden men
GROUP BY GROUPING SETS (A1, A2,...An, GROUPING SETS (C1, C2, ...Cn))inte i Transact-SQL. Transact-SQL tillåterGROUP BY GROUPING SETS( A1, A2,...An, C1, C2, ...Cn)ellerGROUP BY GROUPING SETS( (A1), (A2), ... (An), (C1), (C2), ... (Cn)), som är semantiskt likvärdiga med det förstaGROUP BYexemplet och har tydligare syntax.
GRUPPERA EFTER ()
Anger den tomma gruppen, som genererar totalsumman. Den här gruppen är användbar som ett av elementen i en GROUPING SET. Den här instruktionen ger till exempel den totala försäljningen för varje region och ger sedan totalsumman för alla regioner.
SELECT Region,
SUM(Sales) AS TotalSales
FROM Sales
GROUP BY GROUPING SETS(Region, ());
GRUPPERA EFTER ALLA kolumnuttryck [ ,... n ]
Gäller för: SQL Server, Azure SQL Database, Azure SQL Managed Instance och SQL database in Fabric
Note
Använd endast den här syntaxen för bakåtkompatibilitet. Undvik att använda den här syntaxen i det nya utvecklingsarbetet och planera att ändra program som för närvarande använder den här syntaxen.
GROUP BY ALL T-SQL-syntaxen är annorlunda i Fabric Data Warehouse. För den Fabric Data Warehouse versionen av denna artikel, se VÄLJ - GRUPPERA EFTER för Fabric Data Warehouse.
Anger om alla grupper ska inkluderas i resultaten, oavsett om de uppfyller sökvillkoren i WHERE -satsen. Grupper som inte uppfyller sökvillkoren har NULL för aggregeringen.
-
GROUP BY ALL {columns}stöds inte i frågor som får tillgång till fjärrtabeller om det också finns enWHEREklausul i frågan. -
GROUP BY ALL {columns}misslyckas på kolumner som har attributet FILESTREAM.
Stöd för ISO- och ANSI SQL-2006 GROUP BY-funktioner
GROUP BY Satsen stöder alla GROUP BY funktioner som ingår i SQL-2006-standarden med följande syntaxfel:
- Du kan bara använda
GROUP BY ALLochGROUP BY DISTINCTi en grundläggandeGROUP BYsats som innehåller kolumnuttryck. Du kan inte använda dem med konstruktionernaGROUPING SETS,ROLLUP,CUBE,WITH CUBEellerWITH ROLLUP.ALLär standardvärdet och är implicit. Du kan bara använda den i den bakåtkompatibla syntaxen.
GROUP BY column-expression [ ,... n ] MED { KUB | SAMMANSLAGNING }
Gäller för: SQL Server, Azure SQL Database, Azure SQL Managed Instance och SQL database in Fabric
Legacy GROUP BY <column-expression> WITH CUBE och GROUP BY <column-expression> WITH ROLLUP syntax stöds endast för bakåtkompatibilitet.
Note
Använd endast den här syntaxen för bakåtkompatibilitet. Undvik att använda den här syntaxen i det nya utvecklingsarbetet och planera att ändra program som för närvarande använder den här syntaxen.
MED (DISTRIBUTED_AGG)
gäller för: Azure Synapse Analytics
Frågetipset DISTRIBUTED_AGG stöds inte i SQL Server, Azure SQL Database, Azure SQL Managed Instance, SQL-databaser i Fabric eller Fabric Data Warehouse.
Frågetipset DISTRIBUTED_AGG tvingar MPP-systemet (massively parallel processing) att omdistribuera en tabell i en specifik kolumn innan du utför en aggregering. Du kan bara använda frågetipset DISTRIBUTED_AGG på en kolumn i GROUP BY -satsen. När frågan är klar tas den omdelade tabellen bort. Den ursprungliga tabellen ändras inte.
Note
Frågeledtråden DISTRIBUTED_AGG ger bakåtkompatibilitet och förbättrar inte prestandan för de flesta sökningar. Som standard distribuerar MPP redan data efter behov för att förbättra prestanda för aggregeringar.
Anmärkningar
Så interagerar GROUP BY med SELECT-instruktionen
SELECT Lista:
- Vektoraggregat. Om du inkluderar mängdfunktioner i
SELECTlistanGROUP BYberäknar du ett sammanfattningsvärde för varje grupp. Dessa funktioner kallas vektoraggregat. - Distinkta sammansättningar. Aggregerar
AVG(DISTINCT <column_name>),COUNT(DISTINCT <column_name>)ochSUM(DISTINCT <column_name>)arbetar medROLLUP,CUBEochGROUPING SETS.
WHERE-klausul:
- SQL tar bort rader som inte uppfyller villkoren i
WHERE-satsen innan de utför någon grupperingsåtgärd.
HAVING-klausul:
- SQL använder
HAVING-satsen för att filtrera grupper i resultatuppsättningen.
ORDER BY-klausul:
-
ORDER BYAnvänd -satsen för att beställa resultatuppsättningen.GROUP BYSatsen beställer inte resultatuppsättningen.
NULL värden:
- Om en grupperingskolumn innehåller
NULLvärden behandlar databasmotorn allaNULLvärden som lika och samlar in dem i en enda grupp.
Begränsningar
Gäller för: SQL Server och Azure Synapse Analytics
För en GROUP BY sats som använder ROLLUP, CUBEeller GROUPING SETS, är det maximala antalet uttryck 32. Det maximala antalet grupper är 4 096 (212). Följande exempel misslyckas eftersom GROUP BY satsen har fler än 4 096 grupper.
I följande exempel genereras grupperingsuppsättningar på 4 097 (212 + 1) och misslyckas sedan.
GROUP BY GROUPING SETS( CUBE(a1, ..., a12), b)I följande exempel genereras 4 097 grupper (212 + 1) och misslyckas sedan. Både
CUBE ()och grupperingsuppsättningen()skapar en total summarad och dubblettgrupperingsuppsättningar elimineras inte.GROUP BY GROUPING SETS( CUBE(a1, ..., a12), ())I det här exemplet används den bakåtkompatibla syntaxen. Den genererar 8 192 (213) grupperingsuppsättningar och misslyckas sedan.
GROUP BY CUBE (a1, ..., a13) GROUP BY a1, ..., a13 WITH CUBEFör bakåtkompatibla
GROUP BYsatser som inte innehållerCUBEellerROLLUPbegränsarGROUP BYkolumnstorlekarna, de aggregerade kolumnerna och de mängdvärden som ingår i frågan antaletGROUP BYobjekt. Den här gränsen kommer från gränsen på 8 060 byte på den mellanliggande arbetstabellen som innehåller mellanliggande frågeresultat. Du kan använda högst 12 grupperingsuttryck när du angerCUBEellerROLLUP.
Jämförelse av GROUP BY-funktioner som stöds
I följande tabell beskrivs de GROUP BY funktioner som olika produkter stöder.
| Feature | služba SSIS | SQL Server 1 |
|---|---|---|
DISTINCT Aggregat |
Stöds inte för WITH CUBE eller WITH ROLLUP. |
Stöds för WITH CUBE, WITH ROLLUP, GROUPING SETS, CUBEeller ROLLUP. |
Användardefinierad funktion med CUBE eller ROLLUP namn i GROUP BY -satsen |
Användardefinierad funktion dbo.cube(<arg1>, ...<argN>) eller dbo.rollup(<arg1>, ...<argN>) i -satsen tillåts GROUP BY .Till exempel: SELECT SUM (x) FROM T GROUP BY dbo.cube(y); |
Användardefinierad funktion dbo.cube (<arg1>, ...<argN>) eller dbo.rollup(<arg1>, ...<argN>) i GROUP BY -satsen tillåts inte.Till exempel: SELECT SUM (x) FROM T GROUP BY dbo.cube(y);SQL Server returnerar ett felmeddelande 2. Undvik det här problemet genom att ersätta dbo.cube med [dbo].[cube] eller dbo.rollup med [dbo].[rollup].Följande exempel tillåts: SELECT SUM (x) FROM T GROUP BY [dbo].[cube](y); |
GROUPING SETS |
Stöds inte | Supported |
CUBE |
Stöds inte | Supported |
ROLLUP |
Stöds inte | Supported |
Totalsumma, till exempel GROUP BY() |
Stöds inte | Supported |
funktion GROUPING_ID |
Stöds inte | Supported |
funktion GROUPING |
Supported | Supported |
WITH CUBE |
Supported | Supported |
WITH ROLLUP |
Supported | Supported |
WITH CUBE eller WITH ROLLUP "duplicera" borttagning av gruppering |
Supported | Supported |
1Databaskompatibilitetsnivå 100 och högre.
2 Felmeddelandet som returneras är: Incorrect syntax near the keyword 'cube'|'rollup'.
Examples
Kodexemplen i denna artikel använder AdventureWorks2025, AdventureWorksDW2025, eller AdventureWorksLT2025 exempeldatabasen, som du kan ladda ner från Azure Data SQL Samples Repository GitHub-arkivet.
A. Använda en grundläggande GROUP BY-sats
I följande exempel hämtas summan för var och en SalesOrderID från SalesOrderDetail tabellen. I det här exemplet används AdventureWorks.
SELECT SalesOrderID,
SUM(LineTotal) AS SubTotal
FROM Sales.SalesOrderDetail AS sod
GROUP BY SalesOrderID
ORDER BY SalesOrderID;
B. Använda en GROUP BY-sats med flera tabeller
I följande exempel hämtas antalet anställda för var och en City från tabellen Address som är ansluten till EmployeeAddress tabellen. I det här exemplet används AdventureWorks.
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. Använda en GROUP BY-sats med ett uttryck
I följande exempel hämtas den totala försäljningen för varje år med hjälp DATEPART av funktionen . Du måste inkludera samma uttryck i både SELECT listan och GROUP BY -satsen.
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. Använda en GROUP BY-sats med en HAVING-sats
I följande exempel används HAVING -satsen för att ange vilka grupper som genereras i GROUP BY satsen ska ingå i resultatuppsättningen.
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);
Exempel: Azure Synapse Analytics
E. Grundläggande användning av GROUP BY-satsen
I följande exempel hittar du det totala beloppet för all försäljning varje dag. Frågan returnerar en rad som innehåller summan av all försäljning för varje dag.
-- Uses AdventureWorksDW
SELECT OrderDateKey,
SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY OrderDateKey
ORDER BY OrderDateKey;
F. Grundläggande användning av DISTRIBUTED_AGG tips
I det här exemplet används DISTRIBUTED_AGG frågetips för att tvinga installationen att blanda tabellen i CustomerKey kolumnen innan den utför aggregeringen.
-- Uses AdventureWorksDW
SELECT CustomerKey,
SUM(SalesAmount) AS sas
FROM FactInternetSales
GROUP BY CustomerKey WITH(DISTRIBUTED_AGG)
ORDER BY CustomerKey DESC;
G. Syntaxvariationer för GROUP BY
När den valda listan inte har några sammansättningar måste du inkludera varje kolumn i urvalslistan i GROUP BY listan. Du kan inkludera beräknade kolumner i urvalslistan, men du behöver inte inkludera dem i GROUP BY listan. De här exemplen visar syntaktiskt giltiga SELECT instruktioner:
-- 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. Använda en GROUP BY-sats med flera GROUP BY-uttryck
I följande exempel grupperas resultat med hjälp av flera GROUP BY villkor. Om det finns undergrupper inom varje OrderDateKey grupp som DueDateKey värdet skiljer sig åt definierar frågan en ny gruppering för resultatuppsättningen.
-- Uses AdventureWorks
SELECT OrderDateKey,
DueDateKey,
SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY OrderDateKey, DueDateKey
ORDER BY OrderDateKey;
I. Använda en GROUP BY-sats med en HAVING-sats
I följande exempel används HAVING -satsen för att ange de grupper som genereras i GROUP BY satsen som ska ingå i resultatuppsättningen. Endast de grupper med orderdatum 2004 eller senare ingår i resultaten.
-- Uses AdventureWorks
SELECT OrderDateKey,
SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY OrderDateKey
HAVING OrderDateKey > 20040000
ORDER BY OrderDateKey;