Udostępnij za pośrednictwem


Grupowanie według języka Transact-SQL ()

Grupy wybranego zestaw wierszy do zestaw wierszy podsumowań przez wartości kolumn lub wyrażenia w SQL Server 2008 R2.Dla każdej grupy jest zwracany jeden wiersz.Zagregowane funkcje w klauzulaSELECT<zaznacz> listy zawierają informacje na temat każdej grupy zamiast poszczególnych wierszy.

Grupuj według klauzula zawiera zgodne z ISO składni i niezgodnym ISO składni.Tylko jeden styl składni mogą być używane w pojedynczą instrukcjaSELECT.Użyj składni zgodne z ISO dla wszystkich nowych zadań.Składnia zgodna-ISO zapewnia zgodność z poprzednimi wersjami.

W tym temacie Grupuj według klauzula można opisać jako ogólne lub proste:

  • Ogólne Grupuj według klauzula obejmuje grupowanie zestawów, modułu, pakiet zbiorczy aktualizacji, WITH CUBE lub WITH ROLLUP.

  • Proste Grupuj według klauzula nie obejmuje grupowanie zestawów, modułu, pakiet zbiorczy aktualizacji, WITH CUBE lub WITH ROLLUP.(Grupuj według), sumy, uznaje się za prosty Grupuj według.

Ikona łącza do tematuKonwencje składni języka Transact-SQL (Transact-SQL)

Składnia

ISO-Compliant Syntax

GROUP BY <group by spec>

<group by spec> ::=
    <group by item> [ ,...n ]

<group by item> ::=
    <simple group by item>
    | <rollup spec>
    | <cube spec>
    | <grouping sets spec>
    | <grand total>

<simple group by item> ::=
    <column_expression>

<rollup spec> ::=
    ROLLUP ( <composite element list> )

<cube spec> ::=
    CUBE ( <composite element list> )

<composite element list> ::=
    <composite element> [ ,...n ]

<composite element> ::=
    <simple group by item>
    | ( <simple group by item list> )

<simple group by item list> ::=
    <simple group by item> [ ,...n ]

<grouping sets spec> ::=
    GROUPING SETS ( <grouping set list> )

<grouping set list> ::=
    <grouping set> [ ,...n ]

<grouping set> ::=
    <grand total>
    | <grouping set item>
    | ( <grouping set item list> )

<empty group> ::=
        ( )

<grouping set item> ::=
    <simple group by item>
    | <rollup spec>
    | <cube spec>

<grouping set item list> ::=
    <grouping set item> [ ,...n ]

Non-ISO-Compliant Syntax
[ GROUP BY [ ALL ] group_by_expression [ ,...n ]
    [ WITH { CUBE | ROLLUP } ] 
]

Argumenty

  • <column_expression>
    Jest wyrażenie na wykonywana jest operacja grupowanie .

  • (PAKIET ZBIORCZY)
    Generuje proste Grupuj według wartość zagregowana wiersze, plus wierszewartość zagregowana sumy częściowej lub super - i również wierszu sumy końcowej.

    Liczba grup, zwracana jest równa liczbie wyrażeń w <lista elementów kompozytowych> plus jeden.Na przykład rozważmy następującą instrukcja.

    SELECT a, b, c, SUM ( <expression> )
    FROM T
    GROUP BY ROLLUP (a,b,c);
    

    Jeden wiersz z Suma częściowa jest generowana dla każdej unikatowej kombinacji wartości (a, b, c), (a, b), i (a).Sumy całkowite wierszy jest również obliczana.

    Kolumny są rzutowane od prawej do lewej.Kolejność kolumna dotyczy grupowania danych wyjściowych ZBIORCZEGO i może mieć wpływ na liczbę wierszy w zestaw wyników.

  • (MODUŁ)
    Generuje proste Grupuj według wartość zagregowana wierszy, pakiet zbiorczy aktualizacji super -wartość zagregowana wierszy i wiersze krzyżowej.

    Moduł wyprowadza grupowanie wszystkich permutacji wyrażeń w <lista elementów kompozytowych>.

    Liczba grup jest generowany jest równe (2n), gdzie n = liczba wyrażeń w <lista elementów kompozytowych>.Na przykład rozważmy następującą instrukcja.

    SELECT a, b, c, SUM (<expression>)
    FROM T
    GROUP BY CUBE (a,b,c);
    

    Jeden wiersz jest generowana dla każdej unikatowej kombinacji wartości (a, b, c), (a, b), (a, c), (b, c), (a), (b) i (c) z Suma częściowa dla każdego wiersza i sumy całkowite wierszy.

    Kolejność kolumn nie wpływa na dane wyjściowe modułu.

  • GRUPOWANIE ZESTAWÓW)
    Określa wiele grup danych w jednej kwerendzie.Określone grupy są agregowane zamiast pełnego zestaw agregacji, które zostały wygenerowane przez CUBE lub ROLLUP.wyniki są równoważne UNION ALL określone grupy.Grupowanie zestawów może zawierać jeden element lub listę elementów.Grupowanie zestawów można określić grupy równoważne zwrócone przez pakiet zbiorczy aktualizacji lub modułu.Aby zapoznać się z przykładami, zobacz Grupowanie zestawów odpowiedniki.<grupowanielistyzestawelement> może zawierać pakiet zbiorczy aktualizacji lub modułu.

  • ( )
    Pusta grupa generuje sumy.

Inne niż ISO zgodny z składni

  • ALL
    Ta funkcja zostanie usunięta z przyszłej wersji programu Microsoft SQL Server. Należy unikać stosowania tej funkcji w nowych projektach oraz zaplanować modyfikację aplikacji, w których obecnie jest używana ta funkcja.Zawiera wszystkie grupy i zestawy wyników, nawet te, które nie mają żadnych wierszy spełniających warunek wyszukiwania określone w klauzulaWHERE.WSZYSTKIE określone dla kolumny podsumowań grup, które nie spełniają warunek wyszukiwaniasą zwracane wartości null .Nie można określić, że wszystkie z podmiotami CUBE lub ROLLUP.

    GRUPY przez wszystkie nie jest obsługiwana w kwerendach, które dostęp zdalny tabel, jeśli istnieje również klauzula WHERE w kwerendzie.GRUPY przez wszystkie zakończy się niepowodzeniem dla kolumn, które mają atrybutFILESTREAM.

  • group_by_expression
    Jest wyrażenie na które grupowanie jest wykonywane.group_by_expressionjest również nazywany grupowanie kolumna.group_by expressionmoże być kolumna lub nie -wartość zagregowana wyrażenie odwołuje się do kolumna zwracanych przez klauzulaFROM.Nie można użyć kolumna alias , który jest zdefiniowana na liście wybierz grupowanie kolumna.

    Ostrzeżenie

    Kolumny typu text, ntext, i image nie mogą być używane w group_by_expression.

    Dla klauzul Grupuj według, które nie zawierają CUBE lub ROLLUP, liczba group_by_expression elementów jest ograniczona przez rozmiarów kolumna Grupuj według, zagregowane kolumny i wartości wartość zagregowana zaangażowanych w kwerendzie.Limit ten pochodzi z limitu bajtów 8,060 na worktable pośrednie, potrzebne do przechowywania kwerendy pośrednie wyniki.Maksymalnie 12 grupowanie wyrażeń jest dozwolone, gdy określono CUBE lub ROLLUP.

    xmlmetody typu danych nie można określić bezpośrednio w group_by_expression.Zamiast tego należy odwołać się do zdefiniowanej przez użytkownika funkcja , która używa xml danych wpisz metod wewnątrz niego lub odnoszą się do obliczanej kolumna , który używa tych.

  • Z MODUŁU
    Ta funkcja zostanie usunięta z przyszłej wersji programu Microsoft SQL Server. Należy unikać stosowania tej funkcji w nowych projektach oraz zaplanować modyfikację aplikacji, w których obecnie jest używana ta funkcja.Określa, że oprócz zwykłych wierszy dostarczonych przez Grupuj według, wiersze podsumowań są wprowadzane do zestaw wyników.Podsumowanie wiersz Grupuj według jest zwracana dla wszystkich możliwych kombinacji grupy i podgrupy, zestaw wyników.GRUPOWANIA funkcja można użyć w celu określenia, czy wartości null w zestaw wyników są Grupuj według wartości podsumowań.

    Liczba wierszy podsumowań w zestaw wyników zależy od liczby kolumn znajdujących się w grupy według klauzula.Ponieważ moduł zwraca wszystkich możliwych kombinacji grupy i podgrupy, liczba wierszy jest takie same, niezależnie od kolejności, w jakiej są określone grupowanie kolumn.

  • Z PAKIETU ZBIORCZEGO
    Ta funkcja zostanie usunięta z przyszłej wersji programu Microsoft SQL Server. Należy unikać stosowania tej funkcji w nowych projektach oraz zaplanować modyfikację aplikacji, w których obecnie jest używana ta funkcja.Określa, że oprócz zwykłych wierszy dostarczonych przez Grupuj według, wiersze podsumowań są wprowadzane do zestaw wyników.Grupy są podsumowane w porządku hierarchicznym, od najniższego poziom w grupie do najwyższego.Hierarchia grup zależy od kolejności, w jakiej są określone grupowanie kolumn.Zmienianie kolejności kolumn grupowanie może wpłynąć na liczbę wierszy, produkowane w zestaw wyników.

    Ważna informacjaWażne:

    Odrębne agregatów, na przykład AVG (DISTINCT column_name), liczba (DISTINCT column_name) i SUM (DISTINCT column_name), nie są obsługiwane podczas używania CUBE lub ROLLUP.Jeśli są one używane, Aparat baz danych programu SQL Server zwraca komunikat o błędzie i anuluje kwerendę.

Uwagi

Wyrażenia w grupy według klauzula może zawierać kolumny tabel, pochodne tabel lub widoków w klauzulaFROM.Kolumny nie są wymagane w klauzulaSELECT<zaznacz> listy.

Każdej tabela lub widoku kolumna w dowolne inne niż zbiorcze wyrażenie w <zaznacz> listy musi znajdować się na liście Grupuj według:

  • Dopuszczalne 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;
    
  • Poniższe instrukcje są niedozwolone:

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

Jeśli funkcje wartość zagregowana są zawarte w klauzulaSELECT<lista wyboru>, Grupuj według oblicza wartości podsumowań dla każdej grupy. Są one znane jako zagregowanych danych wektorowych.

Wiersze, które nie spełniają warunki określone w klauzula WHERE zostaną usunięte przed wykonaniem jakiejkolwiek operacji grupowanie .

HAVINGjest używanaklauzula z GROUP klauzula grupom filtru w zestaw wyników.

Grupuj według klauzula nie zamówienia, zestaw wyników.Zamawianie, zestaw wynikówza pomocą ORDER BY klauzula .

Jeśli grupowanie kolumna zawiera wartości null , wszystkie wartości null są uważane za równe i są wprowadzane do jednej grupy.

Nie możesz użyć Grupuj według z alias zastąpienie nazwy kolumna w klauzula AS, chyba że alias zastępuje nazwę kolumna w tabela pochodnej w klauzulaFROM.

Zduplikowane grupowanie zestawów z listy Grupowanie USTAWIA nie są eliminowane.Zduplikowane grupowanie zestawów mogą być generowane przez określenie kolumna wyrażenie więcej niż jeden czas lub wyświetlanie kolumna wyrażenie także generowane przez CUBE lub ROLLUP z listy Grupowanie USTAWIA.

Odrębne agregatów, na przykład AVG (DISTINCT column_name), liczba (DISTINCT column_name) i SUM (DISTINCT column_name) są obsługiwane przez pakiet zbiorczy aktualizacji, modułów i grupowanie zestawów.

Pakiet zbiorczy aktualizacji, modułów i zestawy GRUPOWANIA nie można określić w indeksowany widok.

GROUP BY lub HAVING nie można użyć bezpośrednio na kolumnach ntext, text, lub image.Kolumny te mogą używane jako argumenty w funkcji, które zwracają wartość innego typu danych, takich jak CAST() i SUBSTRING().

xmlmetody typu danych nie można określić bezpośrednio w <column_expression>.Zamiast tego należy odwołać się do zdefiniowanej przez użytkownika funkcja , która używa xml danych wpisz metod wewnątrz niego lub odnoszą się do obliczanej kolumna , który używa tych.

Grupowanie zestawów, pakiet zbiorczy aktualizacji i modułu ograniczeń według grupy

Składni ograniczenia

Grupowanie zestawów nie są dozwolone w grupy według klauzula , chyba że są one częścią listy Grupowanie zestawów.Na przykład GROUP BY C1, (C2,..., Cn) nie jest dozwolone, ale GROUP BY GROUPING SETS (C1, (C2, ..., Cn)) jest dozwolona.

Grupowanie zestawów nie są dozwolone wewnątrz grupowanie zestawów.Na przykład GROUP BY GROUPING SETS (C1, GROUPING SETS (C2, C3)) nie jest dozwolona.

Nie - ISO wszystkich, Z modułu i słów kluczowych WITH ROLLUP nie są dozwolone w grupy według klauzula za pomocą pakietu zbiorczego aktualizacji, modułu lub grupowanie zestawów słów kluczowych.

Ograniczenia rozmiaru

Proste Grupuj według brak limitu liczby wyrażeń.

Grupuj według klauzula korzystającej z pakietu zbiorczego aktualizacji, modułu lub grupowanie USTAWIA, maksymalna liczba wyrażeń jest 32 i maksymalna liczba grupowanie zestawów, które mogą być generowane wynosi 4096 (212).Poniższe przykłady nie powiedzie się, ponieważ jest zbyt złożona Grupuj według klauzula :

  • Poniższe przykłady wygenerować 8192 (213) grupowanie zestawów.

    GROUP BY CUBE (a1, ..., a13) 
    GROUP BY a1, ..., a13 WITH CUBE 
    
  • Poniższy przykład generuje 4097 (212 + 1) grupowanie zestawów.

    GROUP BY GROUPING SETS( CUBE(a1, ..., a12), b )
    
  • Poniższy przykład generuje również 4097 (212 + 1) grupowanie zestawów.Obie CUBE () i () grupowanie zestaw wytwarzają wierszu sumy końcowej i zduplikowane grupowanie zestawów nie są eliminowane.

    GROUP BY GROUPING SETS( CUBE(a1, ..., a12), ())
    

Obsługa ISO i ANSI SQL-2006 grupy według funkcji

W SQL Server 2008 i nowsze wersje Grupuj według klauzula nie może zawierać podzapytanie w wyrażenie używany do Grupuj według listy.Zwracany jest błąd 144.

SQL Server 2008i nowsze wersje obsługują wszystkie grupy przez funkcje zawarte w SQL-2006 standard z następującymi wyjątkami składni:

  • Grupowanie zestawów nie są dozwolone w grupy według klauzula , chyba, że są one częścią jawna lista USTAWIA GRUPOWANIA.For example GROUP BY Column1, (Column2, ...ColumnN) jest dozwolony w standardzie, ale nie w SQL Server.GROUP BY C1, GROUPING SETS ((Column2, ...ColumnN))lub GROUP BY Column1, Column2, ... ColumnN jest dozwolona.Są to semantycznie równoważne do poprzedniego GROUP BY przykład.To jest możliwość uniknięcia, GROUP BY Column1, (Column2, ...ColumnN) może być błędnie zinterpretowana jako GROUP BY C1, GROUPING SETS ((Column2, ...ColumnN)).To nie jest semantycznie równoważne.

  • Grupowanie zestawów nie są dozwolone wewnątrz grupowanie zestawów.Na przykład GROUP BY GROUPING SETS (A1, A2,…An, GROUPING SETS (C1, C2, ...Cn)) jest dozwolona w SQL-2006 standardowego, ale nie w SQL Server.SQL Server 2008i nowsze wersje umożliwiają GROUP BY GROUPING SETS( A1, A2,...An, C1, C2, ...Cn ) lub GROUP BY GROUPING SETS( (A1), (A2), ... (An), (C1), (C2), ... (Cn) ).W tych przykładach są semantycznie równoważne w pierwszym przykładzie Grupuj według i mają lepszy składni.

  • Grupuj według [ALL/DISTINCT] nie jest dozwolone w ogólnym Grupuj według klauzula lub z konstrukcjami grupowanie zestawów, pakiet zbiorczy aktualizacji, modułu, Z CUBE lub ROLLUP Z.WSZYSTKIE domyślne i jest niejawne.

Porównanie obsługiwane funkcje według grupy

W poniższej tabela opisano funkcje Grupuj według, które są obsługiwane na podstawie wersja SQL Server i zgodności bazy danych poziom.

Funkcja

SQL Server 2005 Integration Services

SQL Server 2008 zgodności poziom 100

SQL Server 2008 zgodności poziom 90 lub wcześniejsze

Agregaty DISTINCT

Nie jest obsługiwana dla WITH CUBE lub ROLLUP Z.

Obsługiwane dla modułu z pakietu ZBIORCZEGO, grupowanie zestawów, CUBE lub ROLLUP.

Taki sam jak SQL Server 2008 zgodności poziom 100.

funkcja zdefiniowana przez użytkownika o nazwie CUBE lub ROLLUP w grupy według klauzula

Zdefiniowana przez użytkownika funkcja dbo.moduł(arg1,...argN) or dbo.rollup(arg1,...argN) w grupy według klauzula jest dozwolone.

Na przykład:

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

Zdefiniowana przez użytkownika funkcjadbo.moduł (arg1,.. .argn) lub dbo.rollup ()argument1,...argN) w grupy według klauzula jest niedozwolone.

Na przykład:

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

Zwracany jest następujący komunikat o błędzie: "Niepoprawna składnia w sąsiedztwie słowo kluczowe 'moduł' |"pakiet zbiorczy aktualizacji"."

Aby uniknąć tego problemu, należy zastąpić dbo.cube z [dbo].[cube] lub dbo.rollup z [dbo].[rollup].

Poniższy przykład jest dozwolone:

SELECT SUM (x)
FROM T 
GROUP BY [dbo].[cube](y);

Zdefiniowana przez użytkownika funkcjadbo.moduł (arg1,...argN) lub dbo.rollup (arg1),...argN) w grupy według klauzula jest dozwolone

Na przykład:

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

GRUPOWANIE ZESTAWÓW

Nie jest obsługiwany

Obsługiwane

Obsługiwane

MODUŁ

Nie jest obsługiwany

Obsługiwane

Nie jest obsługiwany

PAKIET ZBIORCZY AKTUALIZACJI

Nie jest obsługiwany

Obsługiwane

Nie jest obsługiwany

Suma końcowa, takie jak (Grupuj według)

Nie jest obsługiwany

Obsługiwane

Obsługiwane

GROUPING_ID, funkcja

Nie jest obsługiwany

Obsługiwane

Obsługiwane

Grupowanie, funkcja

Obsługiwane

Obsługiwane

Obsługiwane

Z MODUŁU

Obsługiwane

Obsługiwane

Obsługiwane

Z PAKIETU ZBIORCZEGO

Obsługiwane

Obsługiwane

Obsługiwane

Z CUBE lub ROLLUP Z "duplikat" usuwaniegrupowanie

Obsługiwane

Obsługiwane

Obsługiwane

Przykłady

Przykłady używające grupowanie zestawów, pakiet zbiorczy aktualizacji i modułów, zobacz Użycie klauzuli GROUP BY z operatorami ROLLUP, CUBE i klauzulą GROUPING SETS.

A.Za pomocą prostego Grupuj według klauzula

Poniższy przykład pobiera całkowitą dla każdego SalesOrderID z SalesOrderDetail tabela.

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

B.Korzystanie z wielu tabel Grupuj według klauzula

Poniższy przykład pobiera liczbę pracowników dla każdego City z Address tabela przyłączony do EmployeeAddress tabela.

USE AdventureWorks2008R2;
GO
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.Grupuj według klauzula przy użyciu wyrażenie

Poniższy przykład pobiera całkowitą sprzedaż dla każdego roku przy użyciu DATEPART funkcja.Tym samym wyrażenie musi być obecny w obu SELECT listy i GROUP BY klauzula.

USE AdventureWorks2008R2;
GO
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.Grupuj według klauzula przy użyciu klauzulaHAVING

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

USE AdventureWorks2008R2;
GO
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);