SELECT — klauzula GROUP BY (Transact-SQL)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsEndpoint analityki SQL w Microsoft FabricMagazyn w Microsoft FabricBaza danych SQL w Microsoft Fabric

Klauzula SELECT instrukcji, która dzieli wynik zapytania na grupy wierszy, zwykle wykonując co najmniej jedną agregację w każdej grupie. Instrukcja SELECT zwraca jeden wiersz dla każdej grupy.

Ten artykuł zawiera różne składnie, argumenty, uwagi, uprawnienia i przykłady na podstawie wybranej wersji produktu. Wybierz odpowiednią wersję produktu z listy rozwijanej Wersja.

Syntax

Transact-SQL konwencje składni

Składnia zgodna z ISO dla SQL Server, Azure SQL Database, Azure SQL Managed Instance oraz bazy danych SQL w 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 ] )

Składnia niezgodna z ISO tylko dla kompatybilności wstecznej:

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

Składnia usługi Azure Synapse Analytics:

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

Składnia dla Fabric Data Warehouse i endpointów analityki SQL:

      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

Ekspresja kolumnowa

Określa kolumnę lub nieaggregowane obliczenie w kolumnie. Ta kolumna może należeć do tabeli, tabeli pochodnej lub widoku. Kolumna musi być wyświetlana w FROM klauzuli instrukcji SELECT , ale nie musi być wyświetlana na SELECT liście.

Aby uzyskać prawidłowe wyrażenia, zobacz wyrażenie.

Kolumna musi pojawić się w FROM klauzuli instrukcji SELECT , ale nie jest wymagana do wyświetlenia na SELECT liście. Należy jednak uwzględnić każdą tabelę lub kolumnę widoku na GROUP BY liście, jeśli używasz jej w dowolnym wyrażeniu nieaggregacji na <select> liście.

OPCJE GRUPUJ WEDŁUG

Poniższe opcje rozszerzają klauzulę podstawową GROUP BY , aby obsługiwać agregację hierarchiczną, podsumowania wielowymiarowe, niestandardowe kombinacje grupowania i zachowania wykonywania specyficzne dla platformy. Zapytania mogą używać tych opcji do tworzenia sum częściowych i sum końcowych w ramach pojedynczej operacji logicznej.

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

    Generuje hierarchiczne sumy częściowe dla wymienionych kolumn i końcowej sumy końcowej (na przykład , (a,b,c), (a,b)(a), ). () Użyj go do przeglądania szczegółowego raportów, takich jakmiesiąc>>.

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

    Tworzy wszystkie kombinacje określonych kolumn (pełne 2^n lattice) oraz sumę końcową. Służy do analizy wielowymiarowej w każdym wycinku.

  • ZESTAWY GRUPOWANIA ( <grouping_set> [ , ... n ] )

    Definiuje dokładne grupowania do obliczeń (w tym () sumy końcowej) w jednym przebiegu. Ta opcja jest funkcjonalnie podobna do UNION ALL wielu GROUP BY zapytań, ale zoptymalizowana razem.

  • () (pusty zestaw grupowania)

    Skrót przetwarzania tylko sumy końcowej we wszystkich wierszach. Użyj go samodzielnie jako GROUP BY () lub wewnątrz GROUPING SETSelementu .

  • ALL column-expression [ , ... n ](non-ISO; zgodność z poprzednimi wersjami)

    Skrót do grupowania według wszystkich nieagregowanych elementów. Zachowano pod kątem zgodności; dostępność i semantyka różnią się.

  • wyrażenie-kolumny [ , ... n ] Z { CUBE | 'ROLLUP }(starsza wersja formularza)

    Starsza składnia innej niż ISO, która jest równoważna lub GROUP BY CUBE(...)GROUP BY ROLLUP(...). Obsługiwane tylko w przypadku zgodności z poprzednimi wersjami. Jeśli to możliwe, użyj podklas ISO.

  • Z (DISTRIBUTED_AGG)

    Wskazówki dotyczące rozproszonego wykonywania agregacji podczas grupowania według jednej kolumny. Tylko dedykowane pule SQL w Azure Synapse Analytics wspierają tę opcję.

WYRAŻENIE KOLUMNY GRUPUJ WEDŁUG [ ,... n ]

Grupuje SELECT wyniki instrukcji zgodnie z wartościami na liście co najmniej jednego wyrażenia kolumny.

Na przykład to zapytanie tworzy tabelę Sales z kolumnami dla Region, Territoryi Sales. Wstawia cztery wiersze, a dwa wiersze mają pasujące wartości dla Region i 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);

Tabela Sales zawiera następujące wiersze:

Region Obszary Sales
Canada Alberta 100
Canada Kolumbia Brytyjska 200
Canada Kolumbia Brytyjska 300
Stany Zjednoczone Montana 100

To następne zapytanie grupuje Region i Territory zwraca sumę agregacji dla każdej kombinacji wartości.

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

Wynik zapytania zawiera trzy wiersze, ponieważ istnieją trzy kombinacje wartości dla Region i Territory. Dla TotalSales Kanady i Kolumbii Brytyjskiej jest sumą dwóch wierszy.

Region Obszary TotalSales
Canada Alberta 100
Canada Kolumbia Brytyjska 500
Stany Zjednoczone Montana 100

Wyrażenie kolumnowe w nie GROUP BY może zawierać następujących elementów:

  • Wyrażenie kolumnowe GROUP BY nie może zawierać aliasu kolumny, który zdefiniujesz w liście SELECT . Może użyć aliasu kolumny dla tabeli pochodnej zdefiniowanej w klauzuli FROM .
  • Wyrażenie kolumnowe GROUP BY nie może zawierać kolumny typu text, ntext ani obraz. Można jednak użyć kolumny tekstowej, ntekstu lub obrazu jako argumentu funkcji zwracającej wartość prawidłowego typu danych. Na przykład wyrażenie może używać wartości SUBSTRING() i CAST(). Ta reguła ma również zastosowanie do wyrażeń w klauzuli HAVING .
  • Wyrażenie kolumnowe GROUP BY nie może zawierać metody typu danych xml . Może zawierać funkcję zdefiniowaną przez użytkownika lub kolumnę obliczeniową wykorzystującą metody typów danych xml .
  • Wyrażenie kolumnowe GROUP BY nie może zawierać podzapytania; zapytanie zwraca błąd 144.
  • Wyrażenie kolumnowe GROUP BY nie może zawierać kolumny z widoku indeksowego.

Dozwolone są następujące instrukcje:

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;

Następujące instrukcje nie są dozwolone:

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

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

GRUPUJ WEDŁUG WSZYSTKICH

Dotyczy do: Fabric Data Warehouse i endpointów analityki SQL

Grupuje wiersze w zapytaniu przez wszystkie nieagregowane wyrażenia w liście SELECT , bez konieczności ich wyraźnego wymieniania w klauzuli GROUP BY <columns> .

GROUP BY ALL Upraszcza zapytania agregujące, automatycznie grupując każdą wybraną kolumnę, która nie jest częścią funkcji agregacyjnej.

Ta GROUP BY ALL składnia dotyczy tylko Fabric Data Warehouse i endpointów analityki SQL. Ta GROUP BY ALL składnia nie jest obecnie dostępna w SQL Server, Azure SQL Database, Azure SQL Managed Instance ani bazie danych SQL w Fabric. Dla tych platform użyj składni GROUP BY ALL wyrażeń kolumnowych.

  • GROUP BY ALL identyfikuje wszystkie wyrażenia z listy SELECT .
  • GROUP BY ALL wyklucza wyrażenia owinięte funkcjami agregatnymi.
  • GROUP BY ALL grupuje przez wszystkie pozostałe wyrażenia.
  • GROUP BY ALL nie zmienia semantyki zapytań — jedynie składnię. Dodanie nowej kolumny nieagregowanej do SELECT listy automatycznie wpływa na grupowanie.

W przeciwieństwie do klauzuli jawnej GROUP BY <columns> , która powoduje błąd, jeśli wybrana kolumna nie jest uwzględniona w kluczach grupowania, automatycznie GROUP BY ALL dodaje wszystkie kolumny nieagregowane z SELECT listy do zbioru grupowania. Takie podejście pozwala uniknąć błędu Column is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause .

Warning

Dodanie wielu kolumn do zbioru grupowania może negatywnie wpłynąć na wydajność zapytań.

Jeśli potrzebujesz precyzyjnej kontroli nad grupowaniem kluczy, użyj klauzuli jawnej GROUP BY <columns> i projektuj dodatkowe kolumny nieagregowane, stosując lekką funkcję agregacyjną, taką jak ANY_VALUE.

Poniższy przykład pokazuje, jak używać GROUP BY ALL tego samego zbioru danych co przykłady GROUP BY <columns> , aby ułatwić porównanie zachowań i wyników.

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

GROUP BY ALL niejawnie grupują przez Region i Territory ponieważ są jedynymi nieagregowanymi wyrażeniami na liście SELECT .

Wynik zapytania zawiera trzy wiersze, ponieważ istnieją trzy kombinacje wartości dla Region i Territory. Dla TotalSales Kanady i Kolumbii Brytyjskiej jest sumą dwóch wierszy.

Region Obszary TotalSales
Canada Alberta 100
Canada Kolumbia Brytyjska 500
Stany Zjednoczone Montana 100

To zachowanie jest funkcjonalnie równoważne z jawnym wymieszczeniem wszystkich kolumn nieagregowanych w klauzuli GROUP BY .

GRUPUJ WEDŁUG ZESTAWIENIA ()

Tworzy grupę dla każdej kombinacji wyrażeń kolumn. Ponadto sumuje wyniki w sumy częściowe i sumy końcowe. Podczas tworzenia grup przechodzi od prawej do lewej, zmniejszając liczbę wyrażeń kolumn na potrzeby grupowania i agregacji.

Kolejność kolumn wpływa na ROLLUP dane wyjściowe i może mieć wpływ na liczbę wierszy w zestawie wyników.

Na przykład GROUP BY ROLLUP (col1, col2, col3, col4) tworzy grupy dla każdej kombinacji wyrażeń kolumn na następujących listach:

  • słupek 1, słupek 2, słupek 3, słupek 4
  • col1, col2, col3, NULL
  • col1, col2, NULL, NULL
  • col1, NULL, NULL, NULL
  • NULL, NULL, NULL, NULL (grupa z wartościami NULL jest sumą końcową)

Korzystając z tabeli z poprzedniego przykładu, ten kod uruchamia operację GROUP BY ROLLUP zamiast podstawowej GROUP BY.

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

Wynik zapytania ma te same agregacje co podstawowe GROUP BY bez elementu ROLLUP. Ponadto tworzy sumy częściowe dla każdej wartości regionu. Na koniec daje sumę końcową dla wszystkich wierszy. Wynik wygląda następująco:

Region Obszary TotalSales
Canada Alberta 100
Canada Kolumbia Brytyjska 500
Canada NULL 600
Stany Zjednoczone Montana 100
Stany Zjednoczone NULL 100
NULL NULL 700

GRUPUJ WEDŁUG MODUŁU ()

GROUP BY CUBE tworzy grupy dla wszystkich możliwych kombinacji kolumn. W przypadku GROUP BY CUBE (a, b)elementu wyniki mają grupy dla unikatowych (a, b)wartości , , (NULL, b)(a, NULL)i (NULL, NULL).

Korzystając z tabeli z poprzednich przykładów, ten kod uruchamia operację GROUP BY CUBE w obszarze Region i Terytorium.

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

Wynik zapytania zawiera grupy dla unikatowych (Region, Territory)wartości , , (NULL, Territory)(Region, NULL)i (NULL, NULL). Wyniki wyglądają następująco:

Region Obszary TotalSales
Canada Alberta 100
NULL Alberta 100
Canada Kolumbia Brytyjska 500
NULL Kolumbia Brytyjska 500
Stany Zjednoczone Montana 100
NULL Montana 100
NULL NULL 700
Canada NULL 600
Stany Zjednoczone NULL 100

GRUPUJ WEDŁUG ZESTAWÓW GRUPOWANIA ()

Opcja GROUPING SETS łączy wiele GROUP BY klauzul w jedną GROUP BY klauzulę. Wyniki są takie same jak w UNION ALL przypadku określonych grup.

Na przykład GROUP BY ROLLUP (Region, Territory) i GROUP BY GROUPING SETS ( ROLLUP (Region, Territory)) zwróć te same wyniki.

Jeśli GROUPING SETS ma co najmniej dwa elementy, wyniki są połączeniem elementów. W tym przykładzie jest zwracana unia ROLLUP wyników i CUBE dla regionów i terytorium.

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

Wyniki są takie same jak to zapytanie, które zwraca związek dwóch GROUP BY instrukcji.

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

Program SQL nie konsoliduje zduplikowanych grup wygenerowanych dla GROUPING SETS listy. Na przykład w pliku GROUP BY ((), CUBE (Region, Territory))oba elementy zwracają wiersz sumy końcowej, a oba wiersze są wyświetlane w wynikach.

Obsługa funkcji ISO i ANSI SQL-2006 GROUP BY

Klauzula GROUP BY obsługuje wszystkie GROUP BY funkcje zawarte w standardzie SQL-2006 z następującymi wyjątkami składni:

  • Zestawy grupowania nie są dozwolone w klauzuli GROUP BY , chyba że są częścią jawnej GROUPING SETS listy. Na przykład parametr jest dozwolony w warstwie Standardowa, GROUP BY Column1, (Column2, ...ColumnN) ale nie w języku Transact-SQL. Transact-SQL obsługuje i GROUP BY C1, GROUPING SETS ((Column2, ...ColumnN))GROUP BY Column1, Column2, ... ColumnN, które są semantycznie równoważne. Te klauzule są semantycznie równoważne z poprzednim GROUP BY przykładem. To ograniczenie pozwala uniknąć możliwości GROUP BY Column1, (Column2, ...ColumnN) błędnej interpretacji jako GROUP BY C1, GROUPING SETS ((Column2, ...ColumnN)), która nie jest semantycznie równoważna.

  • Zestawy grupowania nie są dozwolone w zestawach grupowania. Na przykład jest dozwolona w standardzie SQL-2006, GROUP BY GROUPING SETS (A1, A2,...An, GROUPING SETS (C1, C2, ...Cn)) ale nie w języku Transact-SQL. Transact-SQL umożliwia lub GROUP BY GROUPING SETS( A1, A2,...An, C1, C2, ...Cn)GROUP BY GROUPING SETS( (A1), (A2), ... (An), (C1), (C2), ... (Cn)), które są semantycznie równoważne z pierwszym GROUP BY przykładem i mają jaśniejszą składnię.

GRUPUJ WEDŁUG ()

Określa pustą grupę, która generuje sumę końcową. Ta grupa jest przydatna jako jeden z elementów elementu GROUPING SET. Na przykład ta instrukcja zawiera łączną sprzedaż dla każdego regionu, a następnie daje sumę końcową dla wszystkich regionów.

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

GRUPUJ WEDŁUG WSZYSTKICH wyrażeń kolumn [ ,... n ]

Dotyczy do: SQL Server, Azure SQL Database, Azure SQL Managed Instance oraz bazy danych SQL w Fabric

Note

Ta składnia jest używana tylko w celu zapewnienia zgodności z poprzednimi wersjami. Unikaj używania tej składni w nowych pracach programistycznych i zaplanuj modyfikowanie aplikacji, które obecnie używają tej składni.

Składnia GROUP BY ALL T-SQL jest inna w Fabric Data Warehouse. Dla Fabric Data Warehouse wersji tego artykułu zobacz SELECT - GROUP BY aby uzyskać Fabric Data Warehouse.

Określa, czy wszystkie grupy mają być uwzględniane w wynikach, niezależnie od tego, czy spełniają kryteria wyszukiwania w klauzuli WHERE . Grupy, które nie spełniają kryteriów wyszukiwania, mają NULL agregację.

  • GROUP BY ALL {columns} nie jest wspierany w zapytaniach uzyskujących dostęp do zdalnych tabel, jeśli w zapytaniu jest też klauzula WHERE .
  • GROUP BY ALL {columns} nie działa na kolumnach posiadających atrybut FILESTREAM.

Obsługa funkcji ISO i ANSI SQL-2006 GROUP BY

Klauzula GROUP BY obsługuje wszystkie GROUP BY funkcje zawarte w standardzie SQL-2006 z następującymi wyjątkami składni:

  • Można używać GROUP BY ALL tylko klauzuli i GROUP BY DISTINCT w klauzuli podstawowej GROUP BY zawierającej wyrażenia kolumn. Nie można ich używać z konstrukcjami GROUPING SETS, ROLLUP, CUBE, lub WITH CUBEWITH ROLLUP . ALL jest wartością domyślną i jest niejawna. Można go używać tylko w składni zgodnej z poprzednimi wersjami.

WYRAŻENIE KOLUMNY GRUPUJ WEDŁUG [ ,... n ] Z { CUBE | ROLLUP }

Dotyczy do: SQL Server, Azure SQL Database, Azure SQL Managed Instance oraz bazy danych SQL w Fabric

Legacy GROUP BY <column-expression> WITH CUBE i składnia są obsługiwane GROUP BY <column-expression> WITH ROLLUP wyłącznie ze względu na kompatybilność wsteczną.

Note

Ta składnia jest używana tylko w celu zapewnienia zgodności z poprzednimi wersjami. Unikaj używania tej składni w nowych pracach programistycznych i zaplanuj modyfikowanie aplikacji, które obecnie używają tej składni.

Z (DISTRIBUTED_AGG)

Dotyczy: Azure Synapse Analytics

Hint DISTRIBUTED_AGG zapytania nie jest obsługiwany w SQL Server, Azure SQL Database, Azure SQL Managed Instance, bazie danych SQL w Fabric ani Fabric Data Warehouse.

Wskazówka DISTRIBUTED_AGG zapytania wymusza system masowego przetwarzania równoległego (MPP) w celu ponownego dystrybuowania tabeli w określonej kolumnie przed przeprowadzeniem agregacji. Wskazówkę zapytania można użyć DISTRIBUTED_AGG tylko dla jednej kolumny w klauzuli GROUP BY . Po zakończeniu zapytania redystrybucyjna tabela zostanie porzucona. Oryginalna tabela nie została zmieniona.

Note

Wskazówka DISTRIBUTED_AGG zapytania zapewnia kompatybilność wsteczną i nie poprawia wydajności większości zapytań. Domyślnie program MPP redystrybuuje już dane w razie potrzeby w celu zwiększenia wydajności agregacji.

Uwagi

Jak funkcja GROUP BY współdziała z instrukcją SELECT

SELECT Listy:

  • Agregaty wektorowe. W przypadku uwzględnienia funkcji agregujących na SELECT liście GROUP BY oblicza wartość podsumowania dla każdej grupy. Te funkcje są nazywane agregacjami wektorów.
  • Wyraźne agregaty. Agregacje AVG(DISTINCT <column_name>), COUNT(DISTINCT <column_name>)i SUM(DISTINCT <column_name>) działają z elementami ROLLUP, CUBEi GROUPING SETS.

klauzula WHERE

  • Program SQL usuwa wiersze, które nie spełniają warunków w klauzuli WHERE przed wykonaniem żadnej operacji grupowania.

klauzula HAVING

  • Język SQL używa klauzuli HAVING do filtrowania grup w zestawie wyników.

klauzula ORDER BY

  • Użyj klauzuli ORDER BY , aby uporządkować zestaw wyników. Klauzula GROUP BY nie porządkuje zestawu wyników.

NULL wartości:

  • Jeśli kolumna grupowania zawiera NULL wartości, aparat bazy danych traktuje wszystkie NULL wartości jako równe i zbiera je w jednej grupie.

Ograniczenia

Dotyczy: SQL Server i Azure Synapse Analytics

GROUP BY W przypadku klauzuli używającej ROLLUPwartości , CUBElub GROUPING SETSmaksymalna liczba wyrażeń wynosi 32. Maksymalna liczba grup to 4096 (212). Poniższe przykłady kończą się niepowodzeniem, ponieważ klauzula GROUP BY zawiera więcej niż 4096 grup.

  • Poniższy przykład generuje 4097 (212 + 1) zestawów grupowania, a następnie kończy się niepowodzeniem.

    GROUP BY GROUPING SETS( CUBE(a1, ..., a12), b)
    
  • Poniższy przykład generuje 4097 (212 + 1) grup, a następnie kończy się niepowodzeniem. Zarówno CUBE () , jak i () zestaw grupowania tworzą wiersz sumy końcowej i zduplikowane zestawy grupowania nie są wyeliminowane.

    GROUP BY GROUPING SETS( CUBE(a1, ..., a12), ())
    
  • W tym przykładzie użyto składni zgodnej z poprzednimi wersjami. Generuje ona 8192 (213) zestawów grupowania, a następnie kończy się niepowodzeniem.

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

    W przypadku klauzul zgodnych z GROUP BY poprzednimi wersjami, które nie zawierają CUBE wartości lub ROLLUP, GROUP BY rozmiary kolumn, zagregowane kolumny i wartości agregujące zawarte w zapytaniu ograniczają liczbę GROUP BY elementów. Ten limit pochodzi z limitu 8060 bajtów w tabeli roboczej pośredniej zawierającej wyniki zapytania pośredniego. Można użyć maksymalnie 12 wyrażeń grupowania podczas określania CUBE lub ROLLUP.

Porównanie obsługiwanych funkcji GROUP BY

W poniższej GROUP BY tabeli opisano funkcje obsługiwane przez różne produkty.

Feature SQL Server Integration Services SQL Server 1
DISTINCT Agregatów Nieobsługiwane dla WITH CUBE programu lub WITH ROLLUP. Obsługiwane dla WITH CUBEsystemów , WITH ROLLUP, GROUPING SETS, , CUBElub ROLLUP.
Funkcja zdefiniowana przez użytkownika z CUBE nazwą lub ROLLUP w klauzuli GROUP BY Funkcja dbo.cube(<arg1>, ...<argN>) zdefiniowana przez użytkownika lub dbo.rollup(<arg1>, ...<argN>) klauzula jest dozwolona GROUP BY .

Przykład: SELECT SUM (x) FROM T GROUP BY dbo.cube(y);
Funkcja dbo.cube (<arg1>, ...<argN>) zdefiniowana przez użytkownika lub dbo.rollup(<arg1>, ...<argN>) klauzula GROUP BY nie jest dozwolona.

Przykład: SELECT SUM (x) FROM T GROUP BY dbo.cube(y);

Program SQL Server zwraca komunikat o błędzie 2.

Aby uniknąć tego problemu, zastąp ciąg dbo.cube ciągiem [dbo].[cube] lub dbo.rollup .[dbo].[rollup]

Poniższy przykład jest dozwolony: SELECT SUM (x) FROM T GROUP BY [dbo].[cube](y);
GROUPING SETS Niewspierane Supported
CUBE Niewspierane Supported
ROLLUP Niewspierane Supported
Suma końcowa, taka jak GROUP BY() Niewspierane Supported
Funkcja GROUPING_ID Niewspierane Supported
Funkcja GROUPING Supported Supported
WITH CUBE Supported Supported
WITH ROLLUP Supported Supported
WITH CUBE lub WITH ROLLUP "zduplikowane" usuwanie grupowania Supported Supported

1Poziom zgodności bazy danych 100 i wyższy.

2 Zwrócony komunikat o błędzie to: Incorrect syntax near the keyword 'cube'|'rollup'.

Examples

Przykłady kodu opisane w tym artykule korzystają z bazy , AdventureWorksDW2025, czyli AdventureWorksLT2025 przykładowej bazy AdventureWorks2025danych, którą możesz pobrać z repozytorium GitHub w repozytorium Azure Data SQL Samples Repository.

A. Używanie podstawowej klauzuli GROUP BY

Poniższy przykład pobiera sumę dla każdej SalesOrderID z SalesOrderDetail tabeli. W tym przykładzie użyto bazy danych AdventureWorks.

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

B. Używanie klauzuli GROUP BY z wieloma tabelami

Poniższy przykład pobiera liczbę pracowników dla każdego City z Address tabeli dołączonych do EmployeeAddress tabeli. W tym przykładzie użyto bazy danych 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. Używanie klauzuli GROUP BY z wyrażeniem

Poniższy przykład pobiera łączną sprzedaż dla każdego roku przy użyciu DATEPART funkcji . Musisz uwzględnić to samo wyrażenie zarówno na liście, jak i SELECT w klauzuli GROUP BY .

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. Używanie klauzuli GROUP BY z klauzulą HAVING

W poniższym przykładzie użyto klauzuli , HAVING aby określić, które grupy wygenerowane w klauzuli GROUP BY powinny być uwzględnione w zestawie wyników.

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

Przykłady: Azure Synapse Analytics

E. Podstawowe użycie klauzuli GROUP BY

Poniższy przykład znajduje łączną kwotę dla wszystkich sprzedaży każdego dnia. Zapytanie zwraca jeden wiersz zawierający sumę wszystkich sprzedaży dla każdego dnia.

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

F. Podstawowe użycie wskazówki DISTRIBUTED_AGG

W tym przykładzie użyto wskazówki DISTRIBUTED_AGG zapytania, aby wymusić na urządzeniu mieszanie tabeli w CustomerKey kolumnie przed wykonaniem agregacji.

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

G. Odmiany składni dla GRUPUJ WEDŁUG

Gdy lista wyboru nie ma agregacji, należy uwzględnić każdą kolumnę na liście wyboru na GROUP BY liście. Kolumny obliczeniowe można uwzględnić na liście wyboru, ale nie są wymagane do uwzględnienia ich na GROUP BY liście. W poniższych przykładach pokazano składniowo prawidłowe SELECT instrukcje:

-- 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. Używanie klauzuli GROUP BY z wieloma wyrażeniami GROUP BY

Poniższy przykład grupuje wyniki przy użyciu wielu GROUP BY kryteriów. Jeśli w każdej OrderDateKey grupie istnieją podgrupy, które DueDateKey różnią się wartością, zapytanie definiuje nowe grupowanie dla zestawu wyników.

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

I. Używanie klauzuli GROUP BY z klauzulą HAVING

W poniższym przykładzie użyto klauzuli HAVING , aby określić grupy wygenerowane w GROUP BY klauzuli , która powinna zostać uwzględniona w zestawie wyników. W wynikach zostaną uwzględnione tylko te grupy z datami zamówienia w 2004 r. lub nowszym.

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