Sdílet prostřednictvím


VYBRAT - SESKUPIT POD- Transact-SQL

Platí pro:SQL ServerAzure SQL DatabaseSpravovaná instance Azure SQLAzure Synapse AnalyticsAnalytics Platform System (PDW)Koncový bod analýzy SQL v Microsoft FabricSklad v Microsoft FabricDatabáze SQL v Microsoft Fabric

Klauzule příkazu SELECT, která rozdělí výsledek dotazu na skupiny řádků, obvykle provedením jedné nebo více agregací pro každou skupinu. Příkaz SELECT vrátí jeden řádek na skupinu.

Syntax

Transact-SQL konvence syntaxe

-- Syntax for SQL Server and Azure SQL Database   
-- ISO-Compliant Syntax  
  
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 ] )  
  

-- For backward compatibility only.
-- Non-ISO-Compliant Syntax for SQL Server and Azure SQL Database 
  
GROUP BY {
       ALL column-expression [ ,...n ] 
    | column-expression [ ,...n ]  WITH { CUBE | ROLLUP }    
       }

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

-- Syntax for Parallel Data Warehouse  
  
GROUP BY {
      column-name [ WITH (DISTRIBUTED_AGG) ]  
    | column-expression
} [ ,...n ]

Arguments

sloupcový výraz

Určuje sloupec nebo neagregační výpočet sloupce. Tento sloupec může patřit do tabulky, odvozené tabulky nebo zobrazení. Sloupec se musí zobrazit v klauzuli FROM příkazu SELECT, ale není nutné, aby se zobrazil v seznamu SELECT.

Platné výrazy najdete ve výrazu.

Sloupec se musí zobrazit v klauzuli FROM příkazu SELECT, ale není nutné, aby se zobrazil v seznamu SELECT. Každý sloupec tabulky nebo zobrazení v libovolném výrazu, který není součástí výběrového <> seznamu, však musí být zahrnut do seznamu GROUP BY:

Jsou povoleny následující příkazy:

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;  

Následující příkazy nejsou povoleny:

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

Výraz sloupce nemůže obsahovat:

  • Alias sloupce definovaný v seznamu SELECT. Může použít alias sloupce pro odvozenou tabulku definovanou v klauzuli FROM.
  • Sloupec typu text, ntext nebo obrázek Jako argument funkce, která vrací hodnotu platného datového typu, ale můžete použít sloupec textu, ntext nebo obrázek. Výraz může například použít SUBSTRING() a CAST(). To platí také pro výrazy v klauzuli HAVING.
  • metody datového typu XML. Může obsahovat uživatelem definovanou funkci, která používá metody datového typu XML. Může obsahovat počítaný sloupec, který používá metody datového typu XML.
  • Subquery. Vrátí se chyba 144.
  • Sloupec z indexovaného zobrazení

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

Seskupí výsledky příkazu SELECT podle hodnot v seznamu jednoho nebo více výrazů sloupce.

Tento dotaz například vytvoří tabulku Sales se sloupci pro Země, Oblast a Prodej. Vloží čtyři řádky a dva řádky mají odpovídající hodnoty pro zemi a oblast.

CREATE TABLE Sales ( Country VARCHAR(50), Region VARCHAR(50), Sales INT );

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

Tabulka Sales (Prodej) obsahuje tyto řádky:

Country Region Sales
Canada Alberta 100
Canada Britská Kolumbie 200
Canada Britská Kolumbie 300
USA Montana 100

Tento další dotaz seskupí země a oblast a vrátí agregovaný součet pro každou kombinaci hodnot.

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

Výsledek dotazu má 3 řádky, protože pro zemi a oblast existují tři kombinace hodnot. TotalSales pro Kanadu a Britskou Kolumbii je součet dvou řádků.

Country Region TotalSales
Canada Alberta 100
Canada Britská Kolumbie 500
USA Montana 100

SESKUPOVAT PODLE SOUHRNU

Vytvoří skupinu pro každou kombinaci výrazů sloupců. Kromě toho výsledky "zahrnou" do mezisoučtů a celkových součtů. Uděláte to tak, že se přesune zprava doleva a sníží se počet výrazů sloupců, ve kterých vytváří skupiny a agregace.

Pořadí sloupců má vliv na výstup rollupu a může ovlivnit počet řádků v sadě výsledků.

GROUP BY ROLLUP (col1, col2, col3, col4) Například vytvoří skupiny pro každou kombinaci výrazů sloupců v následujících seznamech.

  • sloupec 1, sloupec 2, sloupce 3, sloupce 4
  • sloupec 1, sloupec 2, sloupec 3, NUL
  • col1, col2, NULL, NULL
  • sloupec1, NULL, NULL, NULL
  • NULL, NULL, NULL, NULL –-Toto je celkový součet.

Pomocí tabulky z předchozího příkladu tento kód spustí operaci GROUP BY ROLLUP místo jednoduché funkce GROUP BY.

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

Výsledek dotazu má stejné agregace jako jednoduchá funkce GROUP BY bez funkce ROLLUP. Kromě toho vytvoří mezisoučty pro každou hodnotu Země. Nakonec dává celkový součet pro všechny řádky. Výsledek vypadá takto:

Country Region TotalSales
Canada Alberta 100
Canada Britská Kolumbie 500
Canada NULL 600
USA Montana 100
USA NULL 100
NULL NULL 700

SKUPINA PODLE KRYCHLE ( )

GROUP BY CUBE vytváří skupiny pro všechny možné kombinace sloupců. U funkce GROUP BY CUBE (a, b) výsledky obsahují skupiny jedinečných hodnot (a, b), (NULL, b), (a, NULL) a (NULL, NULL).

Pomocí tabulky z předchozích příkladů tento kód spustí operaci GROUP BY CUBE v zemi a oblasti.

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

Výsledek dotazu obsahuje skupiny pro jedinečné hodnoty (Country, Region), (NULL, Region), (Country, NULL) a (NULL, NULL). Výsledky vypadají takto:

Country Region TotalSales
Canada Alberta 100
NULL Alberta 100
Canada Britská Kolumbie 500
NULL Britská Kolumbie 500
USA Montana 100
NULL Montana 100
NULL NULL 700
Canada NULL 600
USA NULL 100

SESKUPENÍ PODLE SESKUPENÍ MNOŽIN ( )

Možnost GROUPING SETS umožňuje kombinovat více klauzulí GROUP BY do jedné klauzule GROUP BY. Výsledky jsou ekvivalentem funkce UNION ALL zadaných skupin.

Například GROUP BY ROLLUP (Country, Region) a GROUP BY GROUPING SETS ( ROLLUP (Country, Region) ) vrátit stejné výsledky.

Pokud skupiny GROUPING SETS mají dva nebo více prvků, výsledky jsou sjednocením prvků. Tento příklad vrátí sjednocení výsledků funkce ROLLUP a CUBE pro zemi a oblast.

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

Výsledky jsou stejné jako tento dotaz, který vrací sjednocení dvou příkazů GROUP BY.

SELECT Country, Region, SUM(Sales) AS TotalSales
FROM Sales
GROUP BY ROLLUP (Country, Region)
UNION ALL
SELECT Country, Region, SUM(Sales) AS TotalSales
FROM Sales
GROUP BY CUBE (Country, Region);

SQL nekonsoliduje duplicitní skupiny vygenerované pro seznam GROUPING SETS. Například v GROUP BY ( (), CUBE (Country, Region) )obou prvcích se vrátí řádek pro celkový součet a oba řádky budou uvedeny ve výsledcích.

SKUPINA PODLE ()

Určuje prázdnou skupinu, která vygeneruje celkový součet. To je užitečné jako jeden z prvků GROUPING SET. Tento výpis například poskytuje celkový prodej pro každou zemi/oblast a pak celkový součet pro všechny země/oblasti.

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

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

Platí pro: SQL Server a Azure SQL Database

Note

Tato syntaxe je poskytována pouze pro zpětnou kompatibilitu. Odebere se v budoucí verzi. Nepoužívejte tuto syntaxi v nové vývojové práci a naplánujte úpravy aplikací, které tuto syntaxi aktuálně používají.

Určuje zahrnutí všech skupin do výsledků bez ohledu na to, jestli splňují kritéria hledání v klauzuli WHERE. Skupiny, které nesplňují kritéria hledání, mají pro agregaci hodnotu NULL.

SESKUPTE PODLE VŠECH:

  • Nepodporuje se v dotazech, které přistupují ke vzdáleným tabulkám, pokud je v dotazu také klauzule WHERE.
  • U sloupců, které mají atribut FILESTREAM, selže.

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

Platí pro: SQL Server a Azure SQL Database

Note

Tato syntaxe je poskytována pouze pro zpětnou kompatibilitu. Nepoužívejte tuto syntaxi v nové vývojové práci a naplánujte úpravy aplikací, které tuto syntaxi aktuálně používají.

S (DISTRIBUTED_AGG)

Platí pro: Azure Synapse Analytics a Analytics Platform System (PDW)

Tip dotazu DISTRIBUTED_AGG vynutí systém MPP (Massively Parallel Processing), aby před provedením agregace redistribuovali tabulku v určitém sloupci. Pouze jeden sloupec v klauzuli GROUP BY může obsahovat DISTRIBUTED_AGG nápovědu k dotazu. Po dokončení dotazu se redistribuovaná tabulka zahodí. Původní tabulka se nezmění.

POZNÁMKA: DISTRIBUTED_AGG nápovědu k dotazu je poskytována zpětná kompatibilita se staršími verzemi systému PDW (Analytics Platform System) a nezlepší výkon většiny dotazů. MpP už ve výchozím nastavení redistribuuje data podle potřeby, aby se zlepšil výkon agregací.

Obecné poznámky

Jak GROUP BY komunikuje s příkazem SELECT

VYBRAT seznam:

  • Vektorové agregáty. Pokud jsou agregační funkce zahrnuté v seznamu SELECT, funkce GROUP BY vypočítá souhrnnou hodnotu pro každou skupinu. Označují se jako vektorové agregace.
  • Odlišné agregáty. Agregace AVG (DISTINCT column_name), COUNT (DISTINCT column_name) a SUMA (DISTINCT column_name) jsou podporovány pomocí funkcí ROLLUP, CUBE a GROUPING SETS.

Klauzule WHERE:

  • SQL odebere řádky, které nesplňují podmínky v klauzuli WHERE před provedením jakékoli operace seskupení.

MÍT klauzuli:

  • SQL používá klauzuli Having k filtrování skupin v sadě výsledků.

Klauzule ORDER BY:

  • K seřazení sady výsledků použijte klauzuli ORDER BY. Klauzule GROUP BY neřídí sadu výsledků.

NULL hodnoty:

  • Pokud seskupovací sloupec obsahuje hodnoty NULL, považují se všechny hodnoty NULL za stejné a shromažďují se do jedné skupiny.

Limitace a omezení

Platí pro: SQL Server (počínaje verzí 2008) a Azure Synapse Analytics

Maximální kapacita

Pro klauzuli GROUP BY, která používá funkci ROLLUP, CUBE nebo GROUPING SETS, je maximální počet výrazů 32. Maximální počet skupin je 4096 (212). Následující příklady selžou, protože klauzule GROUP BY má více než 4096 skupin.

  • Následující příklad vygeneruje 4097 (212 + 1) seskupovacích sad a selže.

    GROUP BY GROUPING SETS( CUBE(a1, ..., a12), b )  
    
  • Následující příklad vygeneruje skupiny 4097 (212 + 1) a selže. CUBE () Sada () seskupení vytvoří celkový součet řádků a duplicitních sad seskupení, ale neodstraní se.

    GROUP BY GROUPING SETS( CUBE(a1, ..., a12), ())  
    
  • Tento příklad používá zpětně kompatibilní syntaxi. Vygeneruje 8192 (213) sad seskupení a selže.

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

    U zpětně kompatibilních klauzulí GROUP BY, které neobsahují datovou krychli nebo KUMULATIVNÍ, je počet seskupování podle položek omezen velikostí sloupců GROUP BY, agregovanými sloupci a agregovanými hodnotami zahrnutými v dotazu. Tento limit vychází z limitu 8 060 bajtů v přechodné pracovní tabulce, která je potřebná k uložení průběžných výsledků dotazu. Při zadání datové krychle nebo ROLLUP je povoleno maximálně 12 výrazů seskupování.

Podpora funkcí ISO a ANSI SQL-2006 GROUP BY

Klauzule GROUP BY podporuje všechny funkce GROUP BY, které jsou součástí standardu SQL-2006 s následujícími výjimkami syntaxe:

  • Sady seskupení nejsou v klauzuli GROUP BY povoleny, pokud nejsou součástí explicitního seznamu GROUPING SETS. Například GROUP BY Column1, (Column2, ...ColumnN) je povolený ve standardu, ale ne v jazyce Transact-SQL. Transact-SQL podporuje GROUP BY C1, GROUPING SETS ((Column2, ...ColumnN)) a GROUP BY Column1, Column2, ... ColumnNkteré jsou sémanticky ekvivalentní. Ty jsou sémanticky ekvivalentní předchozímu GROUP BY příkladu. Je to proto, aby se zabránilo tomu, že GROUP BY Column1, (Column2, ...ColumnN) může být nesprávně interpretována jako GROUP BY C1, GROUPING SETS ((Column2, ...ColumnN)), což nejsou sémanticky ekvivalentní.

  • Skupiny nejsou v sadách seskupení povoleny. Například GROUP BY GROUPING SETS (A1, A2,...An, GROUPING SETS (C1, C2, ...Cn)) je povolený ve standardu SQL-2006, ale ne v jazyce Transact-SQL. Transact-SQL umožňuje GROUP BY GROUPING SETS( A1, A2,...An, C1, C2, ...Cn ) nebo GROUP BY GROUPING SETS( (A1), (A2), ... (An), (C1), (C2), ... (Cn) ), které jsou sémanticky ekvivalentní prvnímu příkladu GROUP BY a mají jasnější syntaxi.

  • FUNKCE GROUP BY [ALL/DISTINCT] je povolená pouze v jednoduché klauzuli GROUP BY, která obsahuje výrazy sloupců. Není povolena pomocí konstruktorů GROUPING SETS, ROLLUP, CUBE, WITH CUBE nebo WITH ROLLUP. ALL je výchozí hodnota a je implicitní. Povoluje se také pouze v zpětně kompatibilní syntaxi.

Porovnání podporovaných funkcí GROUP BY

Následující tabulka popisuje funkce GROUP BY, které jsou podporované na základě verzí SQL a úrovně kompatibility databáze.

Feature služba SSIS (SQL Server Integration Services) Úroveň kompatibility SQL Serveru 100 nebo vyšší SQL Server 2008 nebo novější s úrovní kompatibility 90.
DISTINCT agregáty Nepodporuje se u funkce WITH CUBE nebo WITH ROLLUP. Podporováno pro FUNKCI DATOVÁ KRYCHLE, S KUMULATIVNÍMI SADAMI, SADAMI SESKUPOVÁNÍ, DATOVOU KRYCHLÍ nebo KUMULATIVNÍ. Stejné jako úroveň kompatibility 100.
Uživatelem definovaná funkce s názvem CUBE nebo ROLLUP v klauzuli GROUP BY Uživatelem definovaná funkce dbo.cube(arg1;... argN) nebo dbo.rollup(arg1;... argN) v klauzuli GROUP BY je povolená.

Příklad: SELECT SUM (x) FROM T GROUP BY dbo.cube(y);
Uživatelem definovaná funkce dbo.cube (arg1,... argN**)** nebo dbo.rollup(arg1;... argN) v klauzuli GROUP BY není povolen.

Příklad: SELECT SUM (x) FROM T GROUP BY dbo.cube(y);

Vrátí se následující chybová zpráva: Nesprávná syntaxe v blízkosti klíčového slova cube | rollup'."

Chcete-li se vyhnout tomuto problému, nahraďte dbo.cube[dbo].[cube] za nebo dbo.rollup za [dbo].[rollup].

Následující příklad je povolený: SELECT SUM (x) FROM T GROUP BY [dbo].[cube](y);
Uživatelem definovaná funkce dbo.cube (arg1,... argN) nebo dbo.rollup(arg1;... argN) v klauzuli GROUP BY je povolená.

Příklad: SELECT SUM (x) FROM T GROUP BY dbo.cube(y);
SADY SESKUPENÍ Není podporováno Supported Supported
CUBE Není podporováno Supported Není podporováno
ROLLUP Není podporováno Supported Není podporováno
Celkový součet, například GROUP BY () Není podporováno Supported Supported
GROUPING_ID funkce Není podporováno Supported Supported
FUNKCE SKUPINOVÁNÍ Supported Supported Supported
S CUBE Supported Supported Supported
S ROLLUPEM Supported Supported Supported
Odebrání duplicitních skupin pomocí datové krychle nebo FUNKCE ROLLUP Supported Supported Supported

Examples

A. Použití jednoduché klauzule GROUP BY

Následující příklad načte celkový součet pro každou SalesOrderID z SalesOrderDetail tabulky. V tomto příkladu se používá AdventureWorks.

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

B. Použití klauzule GROUP BY s více tabulkami

Následující příklad načte počet zaměstnanců pro každý City z Address tabulky spojené s EmployeeAddress tabulkou. V tomto příkladu se používá AdventureWorks.

SELECT a.City, COUNT(bea.AddressID) 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. Použití klauzule GROUP BY s výrazem

Následující příklad načte celkové prodeje za každý rok pomocí DATEPART funkce. Stejný výraz musí být v seznamu i SELECTGROUP BY klauzuli.

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. Použití klauzule GROUP BY s klauzulí HAVING

Následující příklad používá HAVING klauzuli k určení, které skupiny vygenerované v GROUP BY klauzuli by měly být zahrnuty do sady výsledků.

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

Příklady: Azure Synapse Analytics a paralelní datový sklad

E. Základní použití klauzule GROUP BY

Následující příklad najde celkovou částku pro všechny prodeje každý den. Pro každý den se vrátí jeden řádek obsahující součet všech prodejů.

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

F. Základní použití nápovědy pro DISTRIBUTED_AGG

Tento příklad používá nápovědu DISTRIBUTED_AGG dotazu k vynucení náhodného prohazování tabulky ve CustomerKey sloupci před provedením agregace.

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

G. Varianty syntaxe pro GROUP BY

Pokud seznam výběru neobsahuje žádné agregace, musí být každý sloupec v seznamu select zahrnut do seznamu GROUP BY. Počítané sloupce v seznamu výběrů mohou být uvedeny, ale nejsou povinné v seznamu GROUP BY. Tady jsou příklady syntakticky platných příkazů SELECT:

-- 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 SalesTax FROM FactInternetSales GROUP BY SalesAmount;  
SELECT SalesAmount FROM FactInternetSales GROUP BY SalesAmount, SalesAmount*1.10;  

H. Použití FUNKCE GROUP BY s více výrazy GROUP BY

Následující příklad seskupuje výsledky pomocí více GROUP BY kritérií. Pokud v rámci každé OrderDateKey skupiny existují podskupiny, které lze odlišit podle DueDateKey, bude pro sadu výsledků definováno nové seskupení.

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

I. Použití klauzule GROUP BY s klauzulí HAVING

Následující příklad používá HAVING klauzuli k určení skupin vygenerovaných v GROUP BY klauzuli, které by měly být zahrnuty do sady výsledků. Ve výsledcích budou zahrnuty pouze skupiny s daty objednávek v roce 2004 nebo novějším.

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

Viz také

GROUPING_ID (Transact-SQL)
SKUPINOVÁNÍ (Transact-SQL)
SELECT (Transact-SQL)
Klauzule SELECT (Transact-SQL)