GROUP BY(Transact-SQL)

하나 이상의 열 또는 식 값을 사용하여 선택된 행 집합을 요약 행 집합으로 그룹화합니다. 각 그룹에 대해 행 하나가 반환됩니다. SELECT 절 <select> 목록의 집계 함수는 개별 행 대신 각 그룹에 대한 정보를 제공합니다.

GROUP BY 절에서는 ISO 호환 구문과 비-ISO 호환 구문을 사용합니다. 단일 SELECT 문에는 하나의 구문 스타일만 사용할 수 있습니다. 모든 새 작업에 대해 ISO 호환 구문을 사용하십시오. 비-ISO 호환 구문은 이전 버전과의 호환성을 위해 제공됩니다.

이 항목에서는 GROUP BY 절을 다음과 같이 일반 절과 단순 절로 설명합니다.

  • 일반 GROUP BY 절에는 GROUPING SETS, CUBE, ROLLUP, WITH CUBE 또는 WITH ROLLUP이 포함됩니다.

  • 단순 GROUP BY 절에는 GROUPING SETS, CUBE, ROLLUP, WITH CUBE 또는 WITH ROLLUP이 포함되지 않습니다. 총합계 GROUP BY ()는 단순 GROUP BY 절로 간주됩니다.

항목 링크 아이콘Transact-SQL 구문 표기 규칙(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 } ] 
]

인수

  • <<column_expression>>

    • 그룹화 작업이 수행되는 입니다.
  • ROLLUP ( )
    단순 GROUP BY 집계 행과 부분합 또는 상위 집계 행은 물론 총합계 행을 생성합니다.

    반환되는 그룹화 수는 <composite element list>의 식 수에 1을 더한 값과 같습니다. 예를 들어 다음 문을 살펴보십시오.

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

    (a, b, c), (a, b) 및 (a) 값의 각 고유 조합에 대해 부분합을 포함하는 하나의 행이 생성됩니다. 총합계 행도 계산됩니다.

    열은 오른쪽에서 왼쪽으로 롤업됩니다. 열 순서는 ROLLUP의 출력 그룹화에 영향을 주고 결과 집합의 행 수에 영향을 줄 수 있습니다.

  • CUBE ( )
    단순 GROUP BY 집계 행, ROLLUP 상위 집계 행, 교차 집계 행을 생성합니다.

    CUBE는 <composite element list>에 있는 모든 식의 순열에 대한 그룹화를 출력합니다.

    생성된 그룹화 수는 (2n)과 같습니다. 여기서 n은 <composite element list>에 있는 식 수입니다. 예를 들어 다음 문을 살펴보십시오.

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

    각 행에 대한 부분합 및 총합계 행을 포함하는 (a, b, c), (a, b), (a, c), (b, c), (a), (b) 및 (c) 값의 각 고유 조합에 대해 하나의 행이 생성됩니다.

    열 순서는 CUBE 출력에 영향을 주지 않습니다.

  • GROUPING SETS ( )
    한 쿼리에서 데이터의 여러 그룹화를 지정합니다. CUBE 또는 ROLLUP에 의해 생성된 전체 집계 집합 대신 지정한 그룹만 집계됩니다. 결과는 지정한 그룹의 UNION ALL에 해당합니다. GROUPING SETS는 단일 요소 또는 요소 목록을 포함할 수 있습니다. GROUPING SETS는 ROLLUP 또는 CUBE에 의해 반환된 그룹화에 해당하는 그룹화를 지정할 수 있습니다. 예를 보려면 GROUPING SETS와 동등한 연산자을 참조하십시오. <grouping set item list>는 ROLLUP 또는 CUBE를 포함할 수 있습니다.

  • ()
    빈 그룹은 합계를 생성합니다.

비-ISO 호환 구문

  • ALL
    Microsoft SQL Server의 이후 버전에서는 이 기능이 제거됩니다. 새 개발 작업에서는 이 기능을 사용하지 않도록 하고, 현재 이 기능을 사용하는 응용 프로그램은 수정하십시오. WHERE 절에서 지정한 검색 조건에 일치하는 행이 없는 경우에도 모든 그룹과 결과 집합을 포함합니다. ALL이 지정되면 검색 조건에 일치하지 않는 그룹의 요약 열에 Null 값이 반환됩니다. CUBE 또는 ROLLUP 연산자와 함께 ALL을 지정할 수는 없습니다.

    원격 테이블을 액세스하는 쿼리에 WHERE 절이 있으면 GROUP BY ALL을 사용할 수 없습니다. FILESTREAM 특성을 사용하는 열에서는 GROUP BY ALL이 실패합니다.

  • group_by_expression
    그룹화를 수행할 입니다. group_by_expression은 그룹화 열이라고도 합니다. group_by expression은 열이거나 FROM 절에서 반환된 열을 참조하는 집계가 아닌 식이 될 수 있습니다. SELECT 목록에 정의된 열 별칭은 그룹화 열을 지정하기 위해 사용할 수 없습니다.

    [!참고]

    text, ntext 및 image 유형의 열은 group_by_expression에 사용할 수 없습니다.

    CUBE 또는 ROLLUP이 없이 GROUP BY 절을 지정할 경우 group_by_expression 항목의 수는 GROUP BY 열 크기, 집계된 열 및 쿼리에 포함된 집계 값의 제한을 받습니다. 이 제한은 중간 작업 테이블이 중간 쿼리 결과를 보유하는 데 필요한 8,060바이트 제한을 기준으로 책정됩니다. CUBE 또는 ROLLUP이 지정될 경우 최대 12개의 그룹화 식이 허용됩니다.

    xml 데이터 형식 메서드는 group_by_expression에 직접 지정할 수 없습니다. 대신 내부적으로 xml 데이터 형식 메서드를 사용하는 사용자 정의 함수를 참조하거나 이러한 메서드를 사용하는 계산 열을 참조해야 합니다.

  • WITH CUBE
    Microsoft SQL Server의 이후 버전에서는 이 기능이 제거됩니다. 새 개발 작업에서는 이 기능을 사용하지 않도록 하고, 현재 이 기능을 사용하는 응용 프로그램은 수정하십시오. GROUP BY에서 제공하는 일반 행과 더불어 요약 행을 결과 집합에 포함하도록 지정합니다. GROUP BY 요약 행은 결과 집합에 있는 그룹과 하위 그룹의 가능한 모든 조합에 대해 반환됩니다. GROUPING 함수를 사용하여 결과 집합의 Null 값이 GROUP BY 요약 값인지 여부를 확인할 수 있습니다.

    결과 집합에 있는 요약 행의 개수는 GROUP BY 절에 포함된 열의 개수에 의해 결정됩니다. CUBE는 그룹 및 하위 그룹의 가능한 모든 조합을 반환하기 때문에 그룹 열이 지정된 순서에 상관 없이 행의 개수는 같습니다.

  • WITH ROLLUP
    Microsoft SQL Server의 이후 버전에서는 이 기능이 제거됩니다. 새 개발 작업에서는 이 기능을 사용하지 않도록 하고, 현재 이 기능을 사용하는 응용 프로그램은 수정하십시오. GROUP BY에서 제공하는 일반 행과 더불어 요약 행을 결과 집합에 포함하도록 지정합니다. 그룹은 그룹의 가장 낮은 수준부터 가장 높은 수준까지 계층 순서로 요약됩니다. 그룹의 계층은 그룹 열이 지정된 순서에 의해 결정됩니다. 따라서 그룹 열의 순서를 바꾸면 결과 집합에 생성되는 행의 개수에 영향을 미칩니다.

    중요 정보중요

    CUBE 또는 ROLLUP을 사용할 경우 AVG(DISTINCT column_name), COUNT(DISTINCT column_name) 및 SUM(DISTINCT column_name)과 같은 고유 집계는 지원되지 않습니다. 이러한 고유 집계를 사용하면 SQL Server 데이터베이스 엔진에서 오류 메시지를 반환하고 쿼리를 취소합니다.

주의

GROUP BY 절의 식은 FROM 절의 테이블, 파생 테이블 또는 뷰의 열을 포함할 수 있습니다. SELECT 절 <select> 목록에 열이 나타나지 않아야 합니다.

<select> 목록의 모든 비집계 식에 있는 각 테이블 또는 뷰 열은 GROUP BY 목록에 포함되지 않아야 합니다.

  • 다음 문이 허용됩니다.

    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
    
  • 다음 문이 허용되지 않습니다.

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

SELECT 절(<SELECT 목록>)에 집계 함수가 포함되어 있으면 GROUP BY는 그룹별 요약 값을 계산합니다. 이를 벡터 집계라고 합니다.

그룹화 작업이 수행되기 전에 WHERE 절의 조건을 충족하지 않는 행은 제거됩니다.

HAVING 절은 GROUP BY 절과 함께 사용되어 결과 집합의 그룹을 필터링합니다.

GROUP BY 절은 결과 집합의 순서를 지정하지 않습니다. ORDER BY 절을 사용하여 결과 집합의 순서를 지정합니다.

그룹화 열에 Null 값이 있으면 모든 Null 값이 같은 것으로 간주되고 하나의 그룹에 저장됩니다.

별칭이 FROM 절의 파생 테이블에 있는 열 이름을 대체하지 않으면 GROUP BY를 별칭과 함께 사용하여 AS 절의 열 이름을 대체할 수 없습니다.

GROUPING SETS 목록의 중복된 그룹화 집합은 제거되지 않습니다. 중복된 그룹화 집합은 열 식을 두 번 이상 지정하거나 GROUPING SETS 목록의 CUBE 또는 ROLLUP에 의해 생성된 열 식을 나열하여 생성될 수 있습니다.

AVG(DISTINCT column_name), COUNT(DISTINCT column_name) 및 SUM(DISTINCT column_name)과 같은 고유 집계는 ROLLUP, CUBE 및 GROUPING SETS에서 지원되지 않습니다.

인덱싱된 뷰에는 ROLLUP, CUBE 및 GROUPING SETS를 지정할 수 없습니다.

GROUP BY 또는 HAVING은 ntext, text 또는 image의 열에 직접 사용할 수 없습니다. 이러한 열은 SUBSTRING() 및 CAST()와 같은 다른 데이터 형식의 값을 반환하는 함수에서 인수로 사용할 수 있습니다.

xml 데이터 형식 메서드는 <column_expression>에 직접 지정할 수 없습니다. 대신 내부적으로 xml 데이터 형식 메서드를 사용하는 사용자 정의 함수를 참조하거나 이러한 메서드를 사용하는 계산 열을 참조해야 합니다.

GROUPING SETS, ROLLUP 및 CUBE에 대한 GROUP BY 제한 사항

구문 제한 사항

GROUPING SETS 목록의 일부가 아닌 GROUPING SETS를 GROUP BY 절에 사용할 수 없습니다. 예를 들어 GROUP BY C1, (C2,..., Cn)은 사용할 수 없지만 GROUP BY GROUPING SETS (C1, (C2, ..., Cn))은 사용할 수 있습니다.

GROUPING SETS는 GROUPING SETS 내에 사용할 수 없습니다. 예를 들어 GROUP BY GROUPING SETS (C1, GROUPING SETS (C2, C3))은 사용할 수 없습니다.

ISO가 아닌 ALL, WITH CUBE 및 WITH ROLLUP 키워드와 ROLLUP, CUBE 또는 GROUPING SETS 키워드를 GROUP BY 절에서 함께 사용할 수 없습니다.

크기 제한

단순 GROUP BY의 경우 식 수에 제한이 없습니다.

ROLLUP, CUBE 또는 GROUPING SETS를 사용하는 GROUP BY 절의 경우 최대 식 수는 32이고, 생성할 수 있는 최대 그룹화 집합 수는 4096(212)입니다. GROUP BY 절이 너무 복잡하기 때문에 다음 예는 실패합니다.

  • 다음 예에서는 8192(213)개의 그룹화 집합을 생성합니다.

    GROUP BY CUBE (a1, ..., a13) 
    GROUP BY a1, ..., a13 WITH CUBE 
    
  • 다음 예에서는 4097(212 + 1)개의 그룹화 집합을 생성합니다.

    GROUP BY GROUPING SETS( CUBE(a1, ..., a12), b )
    
  • 또한 다음 예에서는 4097(212 + 1)개의 그룹화 집합을 생성합니다. CUBE () 그룹화 집합과 () 그룹화 집합 모두 총합계 행을 생성하고 중복된 그룹화 집합은 제거되지 않습니다.

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

ISO 및 ANSI SQL-2006 GROUP BY 기능 지원

SQL Server 2008에서는 SQL-2006 표준에 포함된 모든 GROUP BY 기능을 지원하지만 다음과 같은 구문 예외가 있습니다.

  • 명시적 GROUPING SETS 목록의 일부가 아닌 그룹화 집합을 GROUP BY 절에 사용할 수 없습니다. 예를 들어 GROUP BY Column1, (Column2, ...ColumnN)을 표준에서 사용할 수 있지만 SQL Server에서는 사용할 수 없습니다. GROUP BY C1, GROUPING SETS ((Column2, ...ColumnN)) 또는 GROUP BY Column1, Column2, ... ColumnN을 사용할 수 있습니다. 이러한 예는 이전 GROUP BY 예와 기능적으로 동일합니다. 이는 GROUP BY Column1, (Column2, ...ColumnN)이 GROUP BY C1, GROUPING SETS ((Column2, ...ColumnN))으로 잘못 해석될 수 있는 가능성을 방지하기 위한 것입니다. 이는 기능적으로 동일하지 않습니다.

  • 그룹화 집합은 그룹화 집합 내에 사용할 수 없습니다. 예를 들어 GROUP BY GROUPING SETS (A1, A2,¡¦An, GROUPING SETS (C1, C2, ...Cn))을 SQL-2006 표준에서 사용할 수 있지만 SQL Server에서는 사용할 수 없습니다. SQL Server 2008에서는 GROUP BY GROUPING SETS( A1, A2,...An, C1, C2, ...Cn ) 또는 GROUP BY GROUPING SETS( (A1), (A2), ... (An), (C1), (C2), ... (Cn) )을 사용할 수 있습니다. 이러한 예는 첫 번째 GROUP BY 예와 기능적으로 동일하며 보다 명확한 구문을 포함합니다.

  • GROUP BY [ALL/DISTINCT]는 일반 GROUP BY 절에서 사용할 수 없으며 GROUPING SETS, ROLLUP, CUBE, WITH CUBE 또는 WITH ROLLUP 구문과 함께 사용할 수 없습니다. ALL은 기본값이며 암시적입니다.

지원되는 GROUP BY 기능 비교

다음 표에서는 SQL Server 버전 및 데이터베이스 호환성 수준을 기반으로 지원되는 GROUP BY 기능에 대해 설명합니다.

기능

SQL Server 2005 Integration Services

SQL Server 2008 호환성 수준 100

SQL Server 2008 호환성 수준 90 이하

DISTINCT 집계

WITH CUBE 또는 WITH ROLLUP에 대해 지원되지 않습니다.

WITH CUBE, WITH ROLLUP, GROUPING SETS, CUBE 또는 ROLLUP에 대해 지원됩니다.

SQL Server 2008 호환성 수준 100과 같습니다.

GROUP BY 절에서 이름이 CUBE 또는 ROLLUP인 사용자 정의 함수

GROUP BY 절에서 사용자 정의 함수 dbo.cube(arg1,...argN) 또는 dbo.rollup(arg1,...argN)을 사용할 수 있습니다.

예:

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

GROUP BY 절에서 사용자 정의 함수 dbo.cube(arg1,...argN) 또는 dbo.rollup(arg1,...argN)을 사용할 수 없습니다.

예:

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

"키워드 'cube'|'rollup' 근처의 구문이 잘못되었습니다"라는 오류 메시지가 반환됩니다.

이 문제를 방지하려면 dbo.cube를 [dbo].[cube]로 바꾸거나 dbo.rollup을 [dbo].[rollup]으로 바꿉니다.

다음 예를 사용할 수 있습니다.

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

GROUP BY 절에서 사용자 정의 함수 dbo.cube(arg1,...argN) 또는 dbo.rollup(arg1,...argN)을 사용할 수 있습니다.

예:

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

GROUPING SETS

지원되지 않습니다.

지원됩니다.

지원됩니다.

CUBE

지원되지 않습니다.

지원됩니다.

지원되지 않습니다.

ROLLUP

지원되지 않습니다.

지원됩니다.

지원되지 않습니다.

GROUP BY ()와 같은 총합계

지원되지 않습니다.

지원됩니다.

지원됩니다.

GROUPING_ID 함수

지원되지 않습니다.

지원됩니다.

지원됩니다.

GROUPING 함수

지원됩니다.

지원됩니다.

지원됩니다.

WITH CUBE

지원됩니다.

지원됩니다.

지원됩니다.

WITH ROLLUP

지원됩니다.

지원됩니다.

지원됩니다.

WITH CUBE 또는 WITH ROLLUP "중복된" 그룹화 제거

지원됩니다.

지원됩니다.

지원됩니다.

GROUPING SETS, ROLLUP 및 CUBE를 사용하는 예는 ROLLUP, CUBE 및 GROUPING SETS에 GROUP BY 사용을 참조하십시오.

1. 간단한 GROUP BY 절 사용

다음 예에서는 SalesOrderDetail 테이블의 각 SalesOrderID에 대한 합계를 계산합니다.

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

2. 여러 개의 테이블에 대해 GROUP BY 절 사용

다음 예에서는 EmployeeAddress 테이블에 조인된 Address 테이블에서 각 City에 대한 직원 수를 검색합니다.

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;

3. 식에 GROUP BY 절 사용

다음 예에서는 DATEPART 함수를 사용하여 각 연도별 총 판매액을 검색합니다. SELECT 목록과 GROUP BY 절 모두에 같은 식이 있어야 합니다.

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

4. HAVING 절과 함께 GROUP BY 절 사용

다음 예에서는 HAVING 절을 사용하여 GROUP BY 절에 생성된 그룹 중 결과 집합에 포함되어야 하는 그룹을 지정합니다.

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