group-by-clause

GROUP BY절은 R의 행 그룹화로 구성되는 중간 결과 테이블을 지정합니다. R은 subselect의 이전 절에 대한 결과입니다.

구문 도표 읽기시각적 구문 도표 생략
             .-,-----------------------.   
             V                         |   
>>-GROUP BY----+-grouping-expression-+-+-----------------------><
               +-grouping-sets-------+     
               '-super-groups--------'     

가장 간단한 형식의 GROUP BY절에는 grouping expression이 포함됩니다. 그룹화 표현식은 R의 그룹화를 정의하는 데 사용되는 expression입니다. grouping-expression에 포함된 각 표현식이나 column name은 R의 컬럼을 명확하게 식별해야 합니다(SQLSTATE 42702 또는 42703). 그룹화 표현식은 스칼라 fullselect 또는 XMLQUERY나 XMLEXISTS 표현식(SQLSTATE 42822) 또는 결정적이지 않거나 외부 조치가 있는 표현식이나 함수를 포함할 수 없습니다(SQLSTATE 42845).

참고: 명시적 컬럼 참조를 포함하지 않는 다음 표현식을 grouping-expression에서 사용하여 R의 컬럼을 식별할 수 있습니다.
  • ROW CHANGE TIMESTAMP FOR table-designator
  • ROW CHANGE TOKEN FOR table-designator
  • RID_BIT 또는 RID 스칼라 함수

더 복잡한 형식의 GROUP BY절에는 grouping-setssuper-groups가 포함됩니다. grouping-sets에 대한 설명은 grouping-sets의 내용을 참조하십시오. super-groups에 대한 설명은 super-groups의 내용을 참조하십시오.

GROUP BY의 결과는 행 그룹 세트입니다. 이 결과의 각 행은 grouping-expression이 동일한 행 세트를 나타냅니다. 그룹화의 경우 grouping-expression의 모든 모든 널(NULL) 값 동일한 것으로 간주됩니다.

grouping-expression에 10진수 부동 소수점 컬럼이 포함되고 동일한 수의 다중 표현이 이들 컬럼에 존재하는 경우, 리턴되는 수는 숫자의 표현일 수 있습니다.

grouping-expression은 HAVING절의 검색 조건, SELECT절의 표현식 또는 ORDER BY절의 sort-key-expression에서 사용할 수 있습니다(세부사항은 order-by-clause 참조). 모든 경우 참조는 각 그룹에 대해 하나의 값만 지정합니다. 예를 들어, grouping-expressioncol1+col2인 경우 SELECT 목록에서 허용되는 표현식은 col1+col2+3입니다. 해당 표현식이 같은 순서로 평가되도록 하는 괄호를 사용하지 않으면, 표현식의 연관성 규칙이 유사한 표현식인3+col1+col2를 허용하지 않습니다. 따라서 SELECT 목록에서 3+(col1+col2)도 허용됩니다. 병합 연산자를 사용하는 경우 grouping-expression은 표현식이 SELECT 목록에서 지정된 대로 정확하게 사용해야 합니다.

grouping-expression에 뒤 공백이 있는 가변 길이 문자열이 포함되어 있는 경우, 그룹에 있는 값의 뒤 공백 수가 다를 수 있고 길이도 다를 수도 있습니다. 이 경우 grouping-expression에 대한 참조는 계속 각 그룹에 대해 하나의 값만 지정합니다. 그러나 그룹 값은 사용 가능한 값 세트에서 임의적으로 선택되거나, 사용 가능한 값 세트에 있을 수도 있고 없을 수도 있는 정규화된 형식입니다. 그러므로 결과 값의 실제 길이는 예측할 수 없습니다.

설명한 대로 GROUP BY절이 SELECT절에 지정된 컬럼을 표현식(스칼라 fullselect, 비결정적 또는 외부 조치 함수)으로 직접 참조할 수 없는 경우가 있습니다. 이러한 표현식을 사용하여 그룹화하려면, 중첩 테이블 표현식 또는 공통 테이블 표현식을
사용하여 먼저 표현식을 결과 컬럼으로 결과 테이블에 제공하십시오. 중첩된 테이블 표현식을 사용한 예는 subselect 쿼리 예예 9를 참조하십시오.

grouping-sets

구문 도표 읽기시각적 구문 도표 생략
                     .-,-------------------------------------.      
                     V                                       |      
>>-GROUPING SETS--(----+-+-grouping-expression-+-----------+-+--)-><
                       | '-super-groups--------'           |        
                       |    .-,-----------------------.    |        
                       |    V                         |    |        
                       '-(----+-grouping-expression-+-+--)-'        
                              '-super-groups--------'               

grouping-sets 스펙은 단일 명령문에서 여러 그룹화 절을 지정하는 데 사용할 수 있습니다. 이는 둘 이상의 행 그룹을 단일 결과 세트로 통합하는 것으로 간주할 수 있습니다. 이는 논리적으로 여러 개의 subselect를 하나의 그룹화 세트에 해당하는 각 subselect의 group by절과 통합하는 것과 같습니다. 그룹화 세트는 단일 요소 또는 괄호로 구분되는 요소 목록으로 구성될 수 있습니다. 이러한 요소는 grouping-expression 또는 super-group입니다. 그룹은 grouping-sets를 사용하여 기본 테이블에 대해 단일 패스로 계산할 수 있습니다.

단순 grouping-expression 또는 더 복잡한 형식의 super-groupsgrouping-sets 스펙으로 지원됩니다. super-groups에 대한 설명은 super-groups의 내용을 참조하십시오.

그룹화 세트는 GROUP BY 연산의 기반이 되는 구성 요소입니다. 단일 컬럼이 있는 단순 GROUP BY절은 하나의 요소가 있는 그룹화 세트로 간주할 수 있습니다. 예를 들어, 다음과 같습니다.
   GROUP BY a
다음과 동일합니다.
   GROUP BY GROUPING SETS((a))
   GROUP BY a,b,c
다음과 동일합니다.
   GROUP BY GROUPING SETS((a,b,c))

그룹화 세트에서 제외된 하위 선택에 대한 SELECT 목록의 비집계 컬럼은 해당 그룹화 세트에 대해 생성되는 각 행의 해당 컬럼에 대해 널(NULL)을 리턴합니다. 이는 이러한 컬럼의 값을 고려하지 않고 집계가 수행되었음을 나타냅니다.

그룹화 세트의 사용에 대해서는 그룹화 세트, 큐브 및 롤업 쿼리의 예예 2 - 예 7에 설명되어 있습니다.

super-groups

구문 도표 읽기시각적 구문 도표 생략
                                            (1)     
>>-+-ROLLUP--(--grouping-expression-list--)-----+--------------><
   |                                      (2)   |   
   +-CUBE--(--grouping-expression-list--)-------+   
   '-| grand-total |----------------------------'   

grouping-expression-list

   .-,---------------------------------.   
   V                                   |   
|----+-grouping-expression-----------+-+------------------------|
     |    .-,-------------------.    |     
     |    V                     |    |     
     '-(----grouping-expression-+--)-'     

grand-total

|--(--)---------------------------------------------------------|

참고:
  1. group-by-clause에서 단독으로 사용되는 경우 대체 스펙은 grouping-expression-list WITH ROLLUP입니다.
  2. group-by-clause에서 단독으로 사용되는 경우 대체 스펙은 grouping-expression-list WITH CUBE입니다.
ROLLUP( grouping-expression-list )
ROLLUP 그룹화일반 그룹화 행 이외에 부분합 행을 포함하는 결과 세트를 생성하는 GROUP BY절의 확장입니다. 부분합 행은 그룹화된 행을 얻기 위해 사용한 것과 동일한 집계 함수를 적용함으로써 값이 파생된 추가 집계를 포함하는 super-aggregate 행입니다. 이러한 행은 가장 일반적으로 사용되므로 부분합 행이라고 합니다. 그러나 집계를 위해 집계 함수를 사용할 수 있습니다. 예를 들어 MAX 및 AVG가 그룹화 세트, 큐브 및 롤업 쿼리의 예예 8에서 사용됩니다. super-group으로 행이 생성되었는지 여부를 나타내는 데 GROUPING 집계 함수를 사용할 수 있습니다.
ROLLUP 그룹화는 일련의 grouping-sets입니다. n개 요소를 사용한 ROLLUP의 일반적인 스펙의 경우
  GROUP BY ROLLUP(C1,C2,...,Cn-1,Cn)
다음과 같습니다.
  GROUP BY GROUPING SETS((C1,C2,...,Cn-1,Cn)
                         (C1,C2,...,Cn-1)
                         ...
                         (C1,C2)
                         (C1)
                         () )
ROLLUP의 n개 요소가 n+1 그룹화 세트로 변환됩니다. 또한 grouping-expressions가 지정된 순서가 ROLLUP에 중요하다는 점을 염두에 두십시오. 예를 들어 다음 절은
  GROUP BY ROLLUP(a,b)
다음과 같습니다.
  GROUP BY GROUPING SETS((a,b)
                         (a)
                         () )
이와 마찬가지로, 다음 절은
  GROUP BY ROLLUP(b,a)
다음과 같습니다.
  GROUP BY GROUPING SETS((b,a)
                         (b)
                         () )

ORDER BY절은 결과 세트 행의 순서를 보장하는 유일한 방법입니다. 예 3 in 그룹화 세트, 큐브 및 롤업 쿼리의 예에서는 ROLLUP의 사용을 보여줍니다.

CUBE( grouping-expression-list )
CUBE 그룹화는 ROLLUP 집계의 모든 행 및 "cross-tabulation" 행을 포함하는, 결과 세트를 생성하는 GROUP BY절의 확장입니다. Cross-tabulation 행은 부분합이 있는 집계의 일부가 아닌 추가 "super-aggregate" 행입니다. super-group으로 행이 생성되었는지 여부를 나타내는 데 GROUPING 집계 함수를 사용할 수 있습니다.
ROLLUP과 마찬가지로 CUBE 그룹화도 일련의 grouping-sets로 간주할 수 있습니다. CUBE의 경우 큐브 grouping-expression-list의 모든 순열은 총계와 함께 계산됩니다. 그러므로 CUBE의 n개 요소는 2**n(2의 n 제곱) grouping-sets로 변환됩니다. 예를 들어, 다음을 지정하는 것은
   GROUP BY CUBE(a,b,c)

다음과 같습니다.

   GROUP BY GROUPING SETS((a,b,c)
                          (a,b)
                          (a,c)
                          (b,c)
                          (a)
                          (b)
                          (c)
                          () )

CUBE의 3개 요소가 8개의 그룹화 세트로 변환됩니다.

CUBE에서 요소의 지정 순서는 중요하지 않습니다. 'CUBE (DayOfYear, Sales_Person)' 및 'CUBE (Sales_Person, DayOfYear)'는 같은 결과 세트를 생성합니다. '같다'라는 의미는 순서가 아닌 결과 세트의 내용에 적용됩니다. ORDER BY절은 결과 세트 행의 순서를 보장하는 유일한 방법입니다. CUBE의 사용에 대해서는 그룹화 세트, 큐브 및 롤업 쿼리의 예예 4에 설명되어 있습니다.

grouping-expression-list
grouping-expression-list는 CUBE 또는 ROLLUP절 내에서 사용되어 CUBE 또는 ROLLUP 연산의 요소 수를 정의합니다. 이 목록은 여러 grouping-expression에서 요소를 구분하는 괄호를 사용하여 제어됩니다.

예를 들어, 쿼리가 County가 아닌 Province 내에서 City의 ROLLUP에 대한 총 비용을 리턴한다고 가정합니다. 그러나 다음 절의 경우

   GROUP BY ROLLUP(Province, County, City)

County에 대해 원하지 않는 부분합 행을 생성합니다. 다음 절에서

   GROUP BY ROLLUP(Province, (County, City))

(County, City) 복합 유형은 ROLLUP에서 하나의 요소를 형성하므로 이 절을 사용하는 쿼리는 필요한 결과를 생성하게 됩니다. 즉, 2요소 ROLLUP의 경우

   GROUP BY ROLLUP(Province, (County, City))

다음을 생성하고,

   GROUP BY GROUPING SETS((Province, County, City)
                          (Province)
                          () )

3요소 ROLLUP은 다음을 생성합니다.

   GROUP BY GROUPING SETS((Province, County, City)
                          (Province, County)
                          (Province)
                          () )

그룹화 세트, 큐브 및 롤업 쿼리의 예예 2에서는 복합 컬럼 값도 사용합니다.

grand-total
CUBE 및 ROLLUP은 총(총계) 집계 행을 리턴합니다. 이 행은 GROUPING SET절 내에서 빈 괄호를 사용하여 개별적으로 지정할 수 있습니다. 또한 쿼리 결과에 영향을 미치지는 않지만 GROUP BY절에서 직접 지정할 수도 있습니다. 그룹화 세트, 큐브 및 롤업 쿼리의 예예 4에서는 grand-total 구문을 사용합니다.

그룹화 세트 조합

GROUP BY절의 유형을 결합할 때 사용할 수 있습니다. 단순 grouping-expression 필드가 다른 그룹과 결합되면, 필드가 결과 grouping sets의 시작 부분에 "추가"됩니다. ROLLUP 또는 CUBE 표현식을 결합하면, 나머지 표현식에서 "멀티티어"처럼 작동하여 ROLLUP 또는 CUBE의 정의에 따라 추가 그룹화 세트 항목을 형성합니다.

예를 들어, grouping-expression 요소를 결합하면 다음과 같이 작동합니다.
  GROUP BY a, ROLLUP(b,c)
다음과 같습니다.
  GROUP BY GROUPING SETS((a,b,c)
                         (a,b)
                         (a) )
또는
  GROUP BY a, b, ROLLUP(c,d)
다음과 같습니다.
  GROUP BY GROUPING SETS((a,b,c,d)
                         (a,b,c)
                         (a,b) )
ROLLUP 요소를 결합하면 다음과 같이 작동합니다.
  GROUP BY ROLLUP(a), ROLLUP(b,c)

다음과 같습니다.

  GROUP BY GROUPING SETS((a,b,c)
                         (a,b)
                         (a)
                         (b,c)
                         (b)
                         () )

이와 마찬가지로 다음은,

  GROUP BY ROLLUP(a), CUBE(b,c)

다음과 같습니다.

  GROUP BY GROUPING SETS((a,b,c)
                         (a,b)
                         (a,c)
                         (a)
                         (b,c)
                         (b)
                         (c)
                         () )

CUBEROLLUP 요소를 결합하면 다음과 같이 작동합니다.

  GROUP BY CUBE(a,b), ROLLUP(c,d)

다음과 같습니다.

  GROUP BY GROUPING SETS((a,b,c,d)
                         (a,b,c)
                         (a,b)
                         (a,c,d)
                         (a,c)
                         (a)
                         (b,c,d)
                         (b,c)
                         (b)
                         (c,d)
                         (c)
                         () )
단순 grouping-expression과 마찬가지로 그룹화 세트를 결합해도 각 그룹화 세트 내의 중복 항목이 제거됩니다. 예를 들어 다음은
  GROUP BY a, ROLLUP(a,b)
다음과 같습니다.
  GROUP BY GROUPING SETS((a,b)
                         (a) )

그룹화 세트를 결합하는 더 완전한 예는 전체 CUBE 집계에 대해 리턴될 수 있는 특정 행을 제거하는 결과 세트를 구성하는 것입니다.

예를 들어, 다음 GROUP BY절을 고려해 보십시오.
  GROUP BY Region,
           ROLLUP(Sales_Person, WEEK(Sales_Date)),
           CUBE(YEAR(Sales_Date), MONTH (Sales_Date))

GROUP BY의 바로 오른쪽에 나열된 컬럼은 그룹화되고, ROLLUP 뒤의 괄호 안에 있는 컬럼은 롤업되며 CUBE 뒤의 괄호 안에 있는 컬럼은 큐브됩니다. 따라서 GROUP BY절로 인해 YEAR 내에서 MONTH의 큐브가 생성된 후 Region 집계의 Sales_Person에 있는 WEEK 내에서 롤업됩니다. 이로 인해 Region, Sales_Person 또는 WEEK(Sales_Date)에 대한 총계 행이나 cross-tabulation 행은 생성되지 않으므로 다음 절보다 더 적은 수의 행이 생성됩니다.

  GROUP BY ROLLUP (Region, Sales_Person, WEEK(Sales_Date),
                   YEAR(Sales_Date), MONTH(Sales_Date) )