GROUP BY (języka Transact-SQL)

Grupuje wybranego zestaw wierszy do zestaw wierszy podsumowań według wartości jednego lub więcej kolumn lub wyrażeń.Jeden wiersz jest zwracana dla każdej grupy.agregacja funkcji w klauzula SELECT <Wybierz opcję> listę można znaleźć informacje na temat każdej grupy, a nie poszczególnych wierszy.

Klauzula GROUP BY ma zgodne z ISO składni i ISO-niedozwolonej składni.Tylko jeden styl składni można użyć w pojedynczej instrukcja SELECT.Dla wszystkich nowych zadań, należy użyć składni zgodne z ISO.Składnia zgodne z ISO nie znajduje się w celu zapewnienia zgodności z poprzednimi wersjami.

W tym temacie klauzula GROUP BY można określić jako ogólny lub proste:

  • Ogólne klauzula GROUP BY obejmuje zestawy grupowanie, moduł, ROLLUP, WITH moduł lub WITH ROLLUP.

  • Proste klauzula GROUP BY nie zawiera zestawy grupowanie, moduł, ROLLUP, WITH moduł lub WITH ROLLUP.(GROUP BY), sumę całkowitą, jest uważany za zwykłą GROUP BY.

Topic link iconTransact-SQL Syntax Conventions (Transact-SQL)

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>

    • Czy wyrażenie, na których jest wykonywana operacja grupowanie.
  • (PAKIET ZBIORCZY)
    Generuje proste GROUP BY łączna wiersze, oraz sumy częściowej lub super-agregacja wierszy, a także wierszu sumy.

    Liczba grup, zwracana jest równa liczbie wyrażeń w <Lista elementów projektu wstępnego> plus jeden. Na przykład rozważmy następującą instrukcję.

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

    Jeden wiersz zawierający sumę częściową jest generowana dla każdej kombinacji unikatowych wartości (a, b, c), (a, b), a (a). Obliczana jest także wierszu sumy.

    Kolumny są rzutowane od prawej do lewej.kolumna Zamówienia ma wpływ na grupy wyników ROLLUP co może wpłynąć na liczbę wierszy zestaw wyników.

  • (MODUŁ)
    Generuje proste GROUP BY łączna wiersze, ROLLUP super-agregacja wierszy i wiersze krzyżowej.

    Grupowanie dla wszystkich permutacji wyrażeń w wyprowadza moduł <Lista elementów projektu wstępnego>.

    Liczba grup, które generowany jest równe (2n), gdzie n = liczba wyrażenia w liście elementu złożonego < >. Na przykład rozważmy następującą instrukcję.

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

    Jeden wiersz jest tworzone dla każdej kombinacji unikatowych wartości (a, b, c), (a, b), (a, c), (b, c), (a), (b) i (c) z Suma częściowa dla każdego wiersza i w wierszu sumy.

    kolumna zamówienia nie ma wpływu na dane wyjściowe moduł.

  • GRUPOWANIE ZESTAWÓW)
    Określa wiele grup danych w jednej kwerendzie.Tylko określone grupy są łączone zamiast pełnego zestaw agregacji, które zostały wygenerowane przez moduł lub ROLLUP.Wyniki są odpowiednikami UNION ALL określone grupy.ZESTAWY grupowanie może zawierać jeden element lub listę elementów.grupowanie zestawy można określić grupowanie odpowiadających tym, które zostały zwrócone przez ROLLUP lub moduł.Aby zapoznać się z przykładami zobacz GROUPING SETS Equivalents. The <grupowanie zestaw element list> can contain ROLLUP or moduł.

  • ()
    Pusta grupa generuje sumy.

Inne niż ISO Składnia zgodna z

  • ALL
    This feature will be removed in a future version of Microsoft SQL Server. Avoid using this feature in new development work, and plan to modify applications that currently use this feature. Zawiera wszystkie grupy i zestawy wyników, nawet te, które nie mają żadnych wierszy spełniających warunek wyszukiwania określonych w klauzula WHERE.Po określeniu wszystkich wartości null są zwracane dla kolumny podsumowań grup, które nie spełniają warunek wyszukiwania.Nie można określić ALL za pomocą operatorów moduł lub ROLLUP.

    GROUP BY wszystkie nie jest obsługiwana w kwerendach, które dostępu zdalnego tabel, gdy dostępna jest również klauzulę WHERE w kwerendzie.GROUP BY ALL nie powiedzie się w kolumnach, które mają atrybut FILESTREAM.

  • group_by_expression
    Is an expression on which grouping is performed.group_by_expression is also known as a grouping column.group_by expression can be a column or a non-aggregate expression that references a column returned by the FROM clause.Alias kolumna, które zdefiniowano w liście nie można użyć do określenia kolumn grupowanie.

    Uwaga

    Kolumny typu text, ntext, a image Nie można używać w group_by_expression.

    Dla klauzul GROUP BY, które nie zawierają moduł lub ROLLUP, liczba group_by_expression elementy, jest ograniczona GROUP BY szerokości kolumn, w kolumnach agregacja d oraz agregacja wartości zaangażowany w kwerendzie. Limit ten pochodzi z limitu 8,060 bajtów na worktable pośrednie, potrzebnego do wyniki kwerendy pośrednich.Po określeniu moduł lub ROLLUP, dozwolone jest maksymalnie 12 grupowanie wyrażeń.

    xml metody typu danych nie można określić bezpośrednio w group_by_expression. Zamiast tego można znaleźć w funkcja zdefiniowanej przez użytkownika, który używa xml dane wpisz metody wewnątrz niego lub odwoływać się do kolumna obliczana, który ich używa.

  • Z moduł
    This feature will be removed in a future version of Microsoft SQL Server. Avoid using this feature in new development work, and plan to modify applications that currently use this feature. Określa, że oprócz zwykłych wiersze dostarczonych przez GROUP BY, wiersze podsumowań są wprowadzane do zestaw wyników.GROUP BY wiersz podsumowania znajduje się jest zwracana dla wszystkich możliwych kombinacji grupy i podgrupy zestaw wyników.Funkcja grupowanie do ustalenia, czy wartości null zestaw wyników są GROUP BY wartości podsumowań.

    Liczba wierszy podsumowania znajdujących się zestaw wyników zależy od liczby kolumn w klauzula GROUP BY.Ponieważ moduł zwraca wszystkich możliwych kombinacji grupowanie i podgrupy, liczba wierszy jest taka sama, niezależnie od kolejności, w jakiej są określane kolumn grupowanie.

  • Z PAKIETU ZBIORCZEGO
    This feature will be removed in a future version of Microsoft SQL Server. Avoid using this feature in new development work, and plan to modify applications that currently use this feature. Określa, że oprócz zwykłych wiersze dostarczonych przez GROUP BY, wiersze podsumowań są wprowadzane do zestaw wyników.Grupy są sumowane w porządku hierarchicznym, od najniższego poziom w grupie do najwyższego.Hierarchia grupowanie zależy od kolejności, w jakiej są określane kolumn grupowanie.Zmiana kolejności kolumn grupowanie może mieć wpływ na liczbę wierszy, produkowane zestaw wyników.

    Important noteImportant Note:

    Różne agregatów, na przykład AVG (DISTINCT column_name), LICZBA (RÓŻNE column_name) i SUM (DISTINCT column_name), nie są obsługiwane, jeśli używasz moduł lub ROLLUP. Jeśli są one używane SQL Server Database Engine Zwraca komunikat o błędzie i anuluje kwerendę.

Remarks

Wyrażenia w klauzula GROUP BY może zawierać kolumny z tabel, pochodne tabel lub widoków w klauzula FROM.Kolumny nie muszą pojawiać się w klauzula SELECT <Wybierz opcję> Lista.

Każda kolumna tabela lub widoku w dowolnym wyrażeniem nonaggregate w <Wybierz opcję> Lista musi znajdować się na liście GROUP BY:

  • 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
    
  • Niedozwolone są następujące instrukcje:

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

Jeżeli funkcje agregujące są zawarte w klauzula SELECT <Wybierz listę>Group obliczyć sumaryczne wartości dla każdej grupy. Te są znane jako wektor agregatów.

Przed wykonaniem jakiejkolwiek operacji grupowanie, usuwane są wiersze, które nie spełniają warunków w klauzula WHERE.

The HAVING klauzula is used with the GROUP BY klauzula to filter groups in the result zestaw.

Klauzula GROUP BY nie zamówienia zestaw wyników.Aby zamówić zestaw wyników za pomocą klauzula ORDER BY.

Jeśli kolumna grupowanie zawiera wartości null, wszystkie wartości null są traktowane jako równe i są one wprowadzane do jednej grupowanie.

Nie można używać GROUP BY z aliasem do zamiany nazw kolumn w klauzula AS, chyba że alias zastępuje nazwę kolumna w tabela pochodnej w klauzula FROM.

Zestawy grupowanie duplikatów na liście grupowanie USTAWIA nie eliminuje.Zestawy zduplikowane grupowanie mogą być generowane przez określenie wyrażenie kolumna więcej niż jeden raz lub wyrażenie kolumna, także generowane przez moduł lub ROLLUP liście grupowanie USTAWIA listę.

Różne agregatów, na przykład AVG (DISTINCT column_name), LICZBA (RÓŻNE column_name) i SUM (DISTINCT column_name) są obsługiwane przez ROLLUP, moduł i grupowanie zestawów.

ROLLUP, moduł i grupowanie zestawów nie mogą być określane w widoku indeksowanym.

GROUP BY lub HAVING nie mogą być używane bezpośrednio na kolumnach ntext, text, lub image. Te kolumny można używać jako argumentów w funkcjach, które zwracają wartość innego typu danych, takich jak SUBSTRING() i CAST().

xml metody typu danych nie można określić bezpośrednio w <column_expression>. Zamiast tego można znaleźć w funkcja zdefiniowanej przez użytkownika, który używa xml dane wpisz metody wewnątrz niego lub odwoływać się do kolumna obliczana, który ich używa.

GROUP BY ograniczenia dla grupowanie zestawów i ROLLUP moduł

Składnia ograniczenia

grupowanie zestawy nie są dozwolone w klauzula GROUP BY, o ile nie są 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 dozwolone.

grupowanie zestawy nie są dozwolone w zestawach grupowanie.Na przykład GROUP BY GROUPING SETS (C1, GROUPING SETS (C2, C3)) nie jest dozwolone.

Nie — ISO ALL, WITH moduł z słów kluczowych WITH ROLLUP nie są dozwolone w klauzula GROUP BY ROLLUP, moduł lub zestawy grupowanie słów kluczowych.

Ograniczenia rozmiaru

Dla prostych GROUP BY to nie obowiązuje żaden limit liczby wyrażeń.

Dla klauzula GROUP BY używającej ROLLUP, moduł lub USTAWIA grupowanie maksymalna liczba wyrażeń wynosi 32, a maksymalna liczba zestawów grupowanie, które mogą być generowane wynosi 4096 (212).W poniższych przykładach się nie powieść, ponieważ jest zbyt złożona do klauzula GROUP BY:

  • W poniższych przykładach wygenerować 8192 (213) Grupowanie zestawów.

    GROUP BY CUBE (a1, ..., a13) 
    GROUP BY a1, ..., a13 WITH CUBE 
    
  • W poniższym przykładzie generuje 4097 (212 + 1) grupowanie zestawów.

    GROUP BY GROUPING SETS( CUBE(a1, ..., a12), b )
    
  • W poniższym przykładzie generuje również 4097 (212 + 1) grupowanie zestawów.Oba CUBE () oraz () Grupowanie zestaw produkcji w wierszu sumy, a nie eliminuje duplikaty grupowanie zestawów.

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

Obsługa ISO i ANSI SQL 2006 GROUP BY funkcje

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

  • Grupowanie zestawów nie są dozwolone w klauzula GROUP BY, o ile nie są częścią listy jawne USTAWIA GROUPING.For example, GROUP BY Column1, (Column2, ...ColumnN) is allowed in the standard but not in SQL Server.GROUP BY C1, GROUPING SETS ((Column2, ...ColumnN)) or GROUP BY Column1, Column2, ... ColumnN is allowed.Są to semantycznie równoważne z poprzednim GROUP BY przykład:. Ma to zapobiec możliwości, GROUP BY Column1, (Column2, ...ColumnN) mogą być błędnie zinterpretowana jako GROUP BY C1, GROUPING SETS ((Column2, ...ColumnN)). Nie jest semantycznie równoważne.

  • Grupowanie zestawów nie są dozwolone wewnątrz grupowanie zestawów.For example, GROUP BY GROUPING SETS (A1, A2,…An, GROUPING SETS (C1, C2, ...Cn)) is allowed in the SQL-2006 standard but not in SQL Server.SQL Server 2008 allows GROUP BY GROUPING SETS( A1, A2,...An, C1, C2, ...Cn ) or GROUP BY GROUPING SETS( (A1), (A2), ... (An), (C1), (C2), ... (Cn) ).W tych przykładach semantycznie równoważne w pierwszym przykładzie GROUP BY i mają lepszy składni.

  • GROUP BY [ALL/DISTINCT] nie jest dozwolona w ogólnym klauzula GROUP BY lub konstrukcje zestawów grupowanie, ROLLUP, moduł, WITH moduł lub WITH ROLLUP.WSZYSTKO jest domyślny i pośrednie.

Porównanie funkcji obsługiwanych przez GROUP

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

Funkcja

SQL Server 2005 integracja Services

Poziom zgodności programu SQL Server 2008 100

Poziom zgodności programu SQL Server 2008, 90 lub wcześniejsze

Agregaty DISTINCT

Nie jest obsługiwana dla WITH moduł lub WITH ROLLUP.

Obsługiwane WITH moduł WITH ROLLUP, zestawy grupowanie, moduł lub ROLLUP.

Sam, jak SQL Server 2008 poziom zgodności 100.

funkcja zdefiniowanej przez użytkownika o nazwie moduł lub ROLLUP w klauzula GROUP BY

User-defined function dbo.cube(arg1,...argN) or dbo.rollup(arg1,...argN) in the GROUP BY clause is allowed.

Na przykład:

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

User-defined function dbo.cube (arg1,...argN) or dbo.rollup(arg1,...argN) in the GROUP BY clause is not allowed.

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łowa kluczowego 'moduł' |"pakiet"."

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

W poniższym przykładzie jest dozwolone:

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

User-defined function dbo.cube (arg1,...argN) or dbo.rollup(arg1,...argN) in the GROUP BY clause is allowed

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

Nie jest obsługiwany

Obsługiwane

Nie jest obsługiwany

Suma końcowa, takich jak (GROUP BY)

Nie jest obsługiwany

Obsługiwane

Obsługiwane

Funkcja GROUPING_ID

Nie jest obsługiwany

Obsługiwane

Obsługiwane

Funkcja grupowanie

Obsługiwane

Obsługiwane

Obsługiwane

Z moduł

Obsługiwane

Obsługiwane

Obsługiwane

Z PAKIETU ZBIORCZEGO

Obsługiwane

Obsługiwane

Obsługiwane

WITH moduł lub WITH ROLLUP "zduplikowane" grupowanie usuwania

Obsługiwane

Obsługiwane

Obsługiwane

Przykłady

Przykłady, które korzystają z zestawów grupowanie, ROLLUP i moduł można znaleźć w temacie Za pomocą GROUP BY ROLLUP, moduł i grupowanie zestawów.

A.Za pomocą prostego klauzula GROUP BY

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

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

B.Za pomocą klauzula GROUP BY z wieloma tabelami

Poniższy przykład pobiera liczby pracowników, dla każdego City z Address dołączony do tabeli EmployeeAddress Tabela.

USE AdventureWorks;
GO
SELECT a.City, COUNT(ea.AddressID) EmployeeCount
FROM HumanResources.EmployeeAddress ea 
    INNER JOIN Person.Address a
        ON ea.AddressID = a.AddressID
GROUP BY a.City
ORDER BY a.City;

C.Wyrażenie przy użyciu klauzula GROUP BY

Poniższy przykład pobiera całkowitą wartość sprzedaży dla każdego roku przy użyciu DATEPART Funkcja. Tym samym wyrażeniu musi znajdować się w obu SELECT listy i GROUP BY Klauzula.

USE AdventureWorks;
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.Za pomocą klauzula GROUP BY w klauzula HAVING

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

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