그룹화 세트를 사용하여 여러 그룹화를 지정하는 쿼리 작성

완료됨

일반적으로 집계를 지원하기 위해 Transact-SQL의 SELECT 문에서 GROUP BY 절을 사용하여 행을 그룹으로 정렬합니다. 그러나 여러 특성을 동시에 그룹화해야 하는 경우(예: 다른 수준에서 보고하려는 경우) 일반적으로 여러 쿼리를 UNION ALL과 결합해야 합니다. 대신 동일한 쿼리에서 여러 그룹화의 집계를 생성해야 하는 경우 Transact-SQL에서 GROUP BY 절의 GROUPING SETS 하위 절을 사용하면 됩니다. GROUPING SETS는 UNION ALL을 사용하여 여러 개별 쿼리의 결과를 각각 고유한 GROUP BY 절과 결합하는 대안을 제공합니다.

GROUPING SETS 하위 절 사용

GROUPING SETS를 사용하려면 다음 구문 예제와 같이 그룹화할 특성의 조합을 지정합니다.

SELECT <column list with aggregate(s)>
FROM <source>
GROUP BY 
GROUPING SETS(
    (<column_name>),--one or more columns
    (<column_name>),--one or more columns
    () -- empty parentheses if aggregating all rows
        );

예를 들어 모든 행을 집계하는 빈 괄호 표기법 외에도 GROUPING SETS를 사용하여 Sales.CategorySales 테이블의 CategoryCust 열을 집계하려 한다고 가정하겠습니다.

SELECT Category, Cust, SUM(Qty) AS TotalQty
FROM Sales.CategorySales
GROUP BY 
    GROUPING SETS((Category),(Cust),())
ORDER BY Category, Cust;

결과는 다음과 같을 수 있습니다.

범주 고객 TotalQty
NULL NULL 999
NULL 1 80
NULL 2 12
NULL 3 154
NULL 4 241
NULL 5 512
음료 NULL 513
조미료 NULL 114
과자류 NULL 372

결과에 NULL이 있습니다. NULL이 기본 원본에 저장되었거나 집계 결과로 생성된 행의 자리 표시자이기 때문에 NULL이 반환될 수 있습니다. 예를 들어 이전 결과에서 첫 번째 행은 NULL, NULL, 999를 표시합니다. 이것은 총계 행을 나타냅니다. CategoryCust 열의 NULL은 자리 표시자입니다.CategoryCust 둘 다 집계에 참여하지 않기 때문입니다.

NULL이 자리 표시자를 나타내는지 아니면 기본 데이터에서 오는 것인지 알고 싶으면 GROUPING_ID를 사용하면 됩니다. 자세한 내용을 보려면 GROUPING_ID에 대한 참조 페이지를 방문하세요.

CUBE 및 ROLLUP 하위 절 사용

GROUPING SETS와 마찬가지로 CUBE 및 ROLLUP 하위 절도 데이터를 집계하기 위한 여러 그룹화가 가능합니다. 그러나 CUBE 및 ROLLUP은 그룹화할 각 특성 세트를 지정할 필요가 없습니다. 대신 열 세트가 지정된 경우 CUBE는 가능한 모든 조합과 출력 그룹화를 결정합니다. ROLLUP은 입력 열이 계층을 나타낸다고 가정하고 조합을 만듭니다. 따라서 CUBE 및 ROLLUP은 GROUPING SETS의 바로 가기로 간주할 수 있습니다.

CUBE를 사용하려면 GROUP BY 절에 CUBE 키워드를 추가하고 그룹화할 열 목록을 제공합니다. 예를 들어 CategoryCust 열의 모든 조합을 그룹화하려면 쿼리에서 다음 구문을 사용합니다.

SELECT Category, Cust, SUM(Qty) AS TotalQty
FROM Sales.CategorySales
GROUP BY CUBE(Category,Cust);

이렇게 하면 (Category, Cust), (Cust, Category), (Cust), (Category) 조합의 그룹화와 모든 빈 ()의 집계가 출력됩니다.

범주 고객 TotalQty
음료 1 36
조미료 1 44
NULL 1 80
음료 2 5
과자류 2 7
NULL 2 12
음료 3 105
조미료 3 4
과자류 3 45
NULL 3 154
...
NULL NULL 999
음료 NULL 513
조미료 NULL 114
과자류 NULL 372

ROLLUP을 사용하려면 GROUP BY 절에 ROLLUP 키워드를 추가하고 그룹화할 열 목록을 제공합니다. 예를 들어 모든 Category, SubcategoryProduct 열 조합을 그룹화하려면 쿼리에서 다음 구문을 사용합니다.

SELECT Category, Subcategory, Product, SUM(Qty) AS TotalQty
FROM Sales.ProductSales
GROUP BY ROLLUP(Category,Subcategory, Product);

이렇게 하면 (Category, Subcategory, Product), (Category, Subcategory), (Category) 조합의 그룹화와 모든 빈 ()의 집계가 표시됩니다 열이 제공되는 순서가 중요합니다. ROLLUP은 계층을 표현하는 순서대로 열이 나열된다고 가정합니다. ROLLUP은 끝에 있는 모든 그룹화의 총계와 함께 각 그룹화의 소계를 제공합니다.