그룹화 세트를 사용하여 여러 그룹화를 지정하는 쿼리 작성
일반적으로 집계를 지원하기 위해 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 테이블의 Category 및 Cust 열을 집계하려 한다고 가정하겠습니다.
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를 표시합니다. 이것은 총계 행을 나타냅니다.
Category 및 Cust 열의 NULL은 자리 표시자입니다.Category와 Cust 둘 다 집계에 참여하지 않기 때문입니다.
팁
NULL이 자리 표시자를 나타내는지 아니면 기본 데이터에서 오는 것인지 알고 싶으면 GROUPING_ID를 사용하면 됩니다. 자세한 내용을 보려면 GROUPING_ID에 대한 참조 페이지를 방문하세요.
CUBE 및 ROLLUP 하위 절 사용
GROUPING SETS와 마찬가지로 CUBE 및 ROLLUP 하위 절도 데이터를 집계하기 위한 여러 그룹화가 가능합니다. 그러나 CUBE 및 ROLLUP은 그룹화할 각 특성 세트를 지정할 필요가 없습니다. 대신 열 세트가 지정된 경우 CUBE는 가능한 모든 조합과 출력 그룹화를 결정합니다. ROLLUP은 입력 열이 계층을 나타낸다고 가정하고 조합을 만듭니다. 따라서 CUBE 및 ROLLUP은 GROUPING SETS의 바로 가기로 간주할 수 있습니다.
CUBE를 사용하려면 GROUP BY 절에 CUBE 키워드를 추가하고 그룹화할 열 목록을 제공합니다. 예를 들어 Category 및 Cust 열의 모든 조합을 그룹화하려면 쿼리에서 다음 구문을 사용합니다.
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, Subcategory 및 Product 열 조합을 그룹화하려면 쿼리에서 다음 구문을 사용합니다.
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은 끝에 있는 모든 그룹화의 총계와 함께 각 그룹화의 소계를 제공합니다.