ROLLUP, CUBE 및 GROUPING SETS에 GROUP BY 사용
ROLLUP, CUBE 및 GROUPING SETS 연산자는 GROUP BY 절에 대한 확장입니다. ROLLUP, CUBE 또는 GROUPING SETS 연산자는 UNION ALL을 사용하여 단일 그룹화 쿼리를 결합할 때와 동일한 결과 집합을 생성할 수 있지만 일반적으로 GROUP BY 연산자를 사용하는 것이 더 효율적입니다.
GROUPING SETS 연산자는 단순 GROUP BY, ROLLUP 또는 CUBE 연산자를 사용하여 생성하는 것과 동일한 결과 집합을 생성할 수 있습니다. 전체 ROLLUP 또는 CUBE 연산자를 사용하여 생성하는 그룹화 중 일부만 필요할 경우 GROUPING SETS를 사용하여 필요한 그룹화만 지정할 수 있습니다. GROUPING SETS 목록에는 중복된 그룹화가 포함될 수 있기 때문에 GROUPING SETS를 ROLLUP 및 CUBE와 함께 사용할 때 중복된 그룹화가 생성될 수 있습니다. 중복된 그룹화는 UNION ALL을 사용할 때와 마찬가지로 유지됩니다.
[!참고]
CUBE, ROLLUP 및 GROUPING SETS는 CHECKSUM_AGG 함수를 지원하지 않습니다.
복합 및 연결된 요소
GROUPING SETS 목록에서 내부 괄호 안에 있는 여러 열은 단일 집합으로 처리됩니다. 예를 들어 GROUP BY GROUPING SETS ((Colum1, Column2), Column3, Column4) 절에서 Column1과 Column2는 하나의 열로 처리됩니다. 복합 요소에 GROUPING SETS를 사용하는 방법을 보여 주는 예는 이 항목의 뒷부분에 나오는 예 8을 참조하십시오.
GROUPING SETS 목록에 쉼표로 구분된 여러 집합이 내부 괄호로 묶인 채 포함되어 있으면 집합의 출력이 연결된 것입니다. 결과 집합은 그룹화 집합의 교차곱이거나 카티션 곱입니다. 연결된 ROLLUP 연산에 GROUP BY를 사용하는 방법을 보여 주는 예는 이 항목의 뒷부분에 나오는 예 4를 참조하십시오.
ROLLUP 및 CUBE와 OLAP 차원 비교
ROLLUP 및 CUBE 연산자를 사용하는 쿼리는 OLAP 응용 프로그램과 같은 결과 집합을 생성하고 OLAP 응용 프로그램과 같은 계산을 수행합니다. CUBE 연산자는 교차 집계 보고서에 사용할 수 있는 결과 집합을 생성합니다. ROLLUP 연산은 OLAP 차원 또는 계층과 동일한 값을 계산할 수 있습니다.
예를 들어 Year, Month 및 Day 수준 또는 특성이 있는 시간 차원을 지정하면 다음 ROLLUP 연산은 아래와 같은 그룹화를 생성합니다.
연산 |
그룹화 |
---|---|
|
year, month, day year, month year () |
Year, Month 및 Day 시간 차원 수준과 연결된 Region 및 City 수준이 있는 위치 차원을 지정하면 다음 ROLLUP 연산은 아래와 같은 그룹화를 생성합니다.
연산 |
그룹화 |
---|---|
|
region, city, year, month, day region, city, year, month region, city, year region, city region, year, month, day region, year, month region, year region year, month, day year, month year () |
위치 및 시간 차원에서 같은 수준의 CUBE 연산은 아래와 같은 그룹화를 생성합니다.
연산 |
그룹화 |
---|---|
|
region, city, year, month, day region, city, year, month region, city, year region, city region, city, month, day region, city, month region, city, day region, city, year, day region, city, day region, year, month, day region, year, month region, year region, month, day region, month region, year, day region, day region city, year, month, day city, year, month city, year city, month, day city, month city, year, day city, day year, month, day year, month year year, day month, day month day () |
결과 집합의 NULL
GROUP BY 연산자에 의해 생성되는 결과 집합에서 NULL은 다음 용도로 사용됩니다.
그룹화 열에 NULL이 있으면 모든 null 값이 같은 것으로 간주되고 하나의 NULL 그룹에 저장됩니다.
행에서 열이 집계될 때 열의 값이 NULL로 표시됩니다.
다음 예에서는 GROUPING 함수를 사용하여 NULL의 두 가지 용도를 보여 줍니다. UNKNOWN은 열에 있는 null이 그룹화되는 행에서 NULL을 대체하고, ALL은 NULL이 집계에 열이 포함되어 있음을 나타내는 열에서 NULL을 대체합니다.
USE tempdb;
GO
CREATE TABLE dbo.GroupingNULLS (
Store nvarchar(19)
,SaleYear nvarchar(4)
,SaleMonth nvarchar (7))
INSERT INTO dbo.GroupingNULLS VALUES
(NULL,NULL,'January')
,(NULL,'2002',NULL)
,(NULL,NULL,NULL)
,('Active Cycling',NULL ,'January')
,('Active Cycling','2002',NULL)
,('Active Cycling',NULL ,NULL)
,('Active Cycling',NULL,'January')
,('Active Cycling','2003','Febuary')
,('Active Cycling','2003',NULL)
,('Mountain Bike Store','2002','January')
,('Mountain Bike Store','2002',NULL)
,('Mountain Bike Store',NULL,NULL)
,('Mountain Bike Store','2003','January')
,('Mountain Bike Store','2003','Febuary')
,('Mountain Bike Store','2003','March');
SELECT ISNULL(Store,
CASE WHEN GROUPING(Store) = 0 THEN 'UNKNOWN' ELSE 'ALL' END)
AS Store
,ISNULL(CAST(SaleYear AS nvarchar(7)),
CASE WHEN GROUPING(SaleYear)= 0 THEN 'UNKNOWN' ELSE 'ALL' END)
AS SalesYear
,ISNULL(SaleMonth,
CASE WHEN GROUPING(SaleMonth) = 0 THEN 'UNKNOWN' ELSE 'ALL'END)
AS SalesMonth
,COUNT(*) AS Count
FROM dbo.GroupingNULLS
GROUP BY ROLLUP(Store, SaleYear, SaleMonth);
결과 집합은 다음과 같습니다.
Store |
SalesYear |
SalesMonth |
Count |
---|---|---|---|
Unknown |
Unknown |
Unknown |
1 |
Unknown |
Unknown |
January |
1 |
Unknown |
Unknown |
ALL |
2 |
Unknown |
2002 |
Unknown |
1 |
Unknown |
2002 |
ALL |
1 |
Unknown |
ALL |
ALL |
3 |
Active Cycling |
Unknown |
Unknown |
1 |
Active Cycling |
Unknown |
January |
2 |
Active Cycling |
Unknown |
ALL |
3 |
Active Cycling |
2002 |
Unknown |
1 |
Active Cycling |
2002 |
ALL |
1 |
Active Cycling |
2003 |
Unknown |
1 |
Active Cycling |
2003 |
February |
1 |
Active Cycling |
2003 |
ALL |
2 |
Active Cycling |
ALL |
ALL |
6 |
Mountain Bike Store |
Unknown |
Unknown |
1 |
Mountain Bike Store |
Unknown |
ALL |
1 |
Mountain Bike Store |
2002 |
Unknown |
1 |
Mountain Bike Store |
2002 |
January |
1 |
Mountain Bike Store |
2002 |
ALL |
2 |
Mountain Bike Store |
2003 |
February |
1 |
Mountain Bike Store |
2003 |
January |
1 |
Mountain Bike Store |
2003 |
March |
1 |
Mountain Bike Store |
2003 |
ALL |
3 |
Mountain Bike Store |
ALL |
ALL |
6 |
ALL |
ALL |
ALL |
15 |
예
이 섹션의 예에서는 결과 집합을 비교할 수 있도록 SUM 집계 함수를 사용합니다. 또한 다른 집계 함수를 사용하여 다른 합계를 계산할 수도 있습니다.
1. 단수 GROUP BY 사용
다음 예에서는 단순 GROUP BY가 예 2-11의 결과 집합과 비교할 결과 집합을 반환합니다. 이 예에서는 같은 SELECT 문에 GROUP BY 연산자를 사용합니다.
USE AdventureWorks2008R2;
GO
SELECT T.[Group] AS N'Region', T.CountryRegionCode AS N'Country'
,S.Name AS N'Store', H.SalesPersonID
,SUM(TotalDue) AS N'Total Sales'
FROM Sales.Customer C
INNER JOIN Sales.Store S
ON C.StoreID = S.BusinessEntityID
INNER JOIN Sales.SalesTerritory T
ON C.TerritoryID = T.TerritoryID
INNER JOIN Sales.SalesOrderHeader H
ON C.CustomerID = H.CustomerID
WHERE T.[Group] = N'Europe'
AND T.CountryRegionCode IN(N'DE', N'FR')
AND H.SalesPersonID IN(287, 290, 288)
AND SUBSTRING(S.Name,1,4)IN(N'Vers', N'Spa ')
GROUP BY T.[Group], T.CountryRegionCode, S.Name, H.SalesPersonID
ORDER BY T.[Group], T.CountryRegionCode
,S.Name,H.SalesPersonID;
결과 집합은 다음과 같습니다.
Region |
Country |
Store |
SalesPersonID |
Total Sales |
---|---|---|---|---|
Europe |
DE |
Versatile Sporting Goods Company |
284 |
859.232 |
Europe |
DE |
Versatile Sporting Goods Company |
289 |
17691.83 |
Europe |
FR |
Spa and Exercise Outfitters |
284 |
32774.36 |
Europe |
FR |
Spa and Exercise Outfitters |
286 |
246272.4 |
2. GROUP BY ROLLUP 사용
다음 예에서는 ROLLUP 연산자가 아래와 같은 그룹화가 포함된 결과 집합을 반환합니다.
Region, Country, Store 및 SalesPersonID
Region, Country 및 Store
Region및 Country
Region
총합계
ROLLUP에 의해 생성되는 그룹화 수는 ROLLUP 목록에 있는 열 수와 총합계 그룹화를 더한 값과 같습니다. 그룹화의 행 수는 그룹화의 열에 있는 고유한 값 조합 수에 의해 결정됩니다.
USE AdventureWorks2008R2;
GO
SELECT T.[Group] AS N'Region', T.CountryRegionCode AS N'Country'
,S.Name AS N'Store', H.SalesPersonID
,SUM(TotalDue) AS N'Total Sales'
FROM Sales.Customer C
INNER JOIN Sales.Store S
ON C.StoreID = S.BusinessEntityID
INNER JOIN Sales.SalesTerritory T
ON C.TerritoryID = T.TerritoryID
INNER JOIN Sales.SalesOrderHeader H
ON C.CustomerID = H.CustomerID
WHERE T.[Group] = N'Europe'
AND T.CountryRegionCode IN(N'DE', N'FR')
AND H.SalesPersonID IN(287, 290, 288)
AND SUBSTRING(S.Name,1,4)IN(N'Vers', N'Spa ')
GROUP BY ROLLUP(
T.[Group], T.CountryRegionCode, S.Name, H.SalesPersonID)
ORDER BY T.[Group], T.CountryRegionCode, S.Name, H.SalesPersonID;
결과 집합은 다음과 같습니다.
Region |
Country |
Store |
SalesPersonID |
Total Sales |
---|---|---|---|---|
NULL |
NULL |
NULL |
NULL |
297597.8 |
Europe |
NULL |
NULL |
NULL |
297597.8 |
Europe |
DE |
NULL |
NULL |
18551.07 |
Europe |
DE |
Versatile Sporting Goods Company |
NULL |
18551.07 |
Europe |
DE |
Versatile Sporting Goods Company |
284 |
859.232 |
Europe |
DE |
Versatile Sporting Goods Company |
289 |
17691.83 |
Europe |
FR |
NULL |
NULL |
279046.8 |
Europe |
FR |
Spa and Exercise Outfitters |
NULL |
279046.8 |
Europe |
FR |
Spa and Exercise Outfitters |
284 |
32774.36 |
Europe |
FR |
Spa and Exercise Outfitters |
286 |
246272.4 |
3. 열 순서가 반대로 되어 있는 GROUP BY ROLLUP 사용
다음 예에서는 ROLLUP 연산자가 아래와 같은 그룹화가 포함된 결과 집합을 반환합니다.
SalesPersonID, Store, Country 및 Region
SalesPersonID, Store 및 Country
SalesPersonID및 Store
SalesPersonID
총합계
ROLLUP 목록의 열은 예 2의 열과 같지만 롤업 순서가 예 2와 반대로 오른쪽에서 왼쪽으로 되어 있습니다. 따라서 열 순서는 그룹화에 영향을 줍니다. 결과 집합에 있는 행 수는 열 순서에 따라 달라질 수 있습니다.
USE AdventureWorks2008R2;
GO
SELECT T.[Group] AS N'Region', T.CountryRegionCode AS N'Country'
,S.Name AS N'Store', H.SalesPersonID
,SUM(TotalDue) AS N'Total Sales'
FROM Sales.Customer C
INNER JOIN Sales.Store S
ON C.StoreID = S.BusinessEntityID
INNER JOIN Sales.SalesTerritory T
ON C.TerritoryID = T.TerritoryID
INNER JOIN Sales.SalesOrderHeader H
ON C.CustomerID = H.CustomerID
WHERE T.[Group] = N'Europe'
AND T.CountryRegionCode IN(N'DE', N'FR')
AND H.SalesPersonID IN(287, 290, 288)
AND SUBSTRING(S.Name,1,4)IN(N'Vers', N'Spa ')
GROUP BY ROLLUP(
H.SalesPersonID, S.Name, T.CountryRegionCode, T.[Group])
ORDER BY H.SalesPersonID, S.Name, T.CountryRegionCode, T.[Group];
결과 집합은 다음과 같습니다.
Region |
Country |
Store |
SalesPersonID |
Total Sales |
---|---|---|---|---|
NULL |
NULL |
NULL |
NULL |
297597.8 |
NULL |
NULL |
NULL |
284 |
33633.59 |
NULL |
NULL |
Spa and Exercise Outfitters |
284 |
32774.36 |
NULL |
FR |
Spa and Exercise Outfitters |
284 |
32774.36 |
Europe |
FR |
Spa and Exercise Outfitters |
284 |
32774.36 |
NULL |
NULL |
Versatile Sporting Goods Company |
284 |
859.232 |
NULL |
DE |
Versatile Sporting Goods Company |
284 |
859.232 |
Europe |
DE |
Versatile Sporting Goods Company |
284 |
859.232 |
NULL |
NULL |
NULL |
286 |
246272.4 |
NULL |
NULL |
Spa and Exercise Outfitters |
286 |
246272.4 |
NULL |
FR |
Spa and Exercise Outfitters |
286 |
246272.4 |
Europe |
FR |
Spa and Exercise Outfitters |
286 |
246272.4 |
NULL |
NULL |
NULL |
289 |
17691.83 |
NULL |
NULL |
Versatile Sporting Goods Company |
289 |
17691.83 |
NULL |
DE |
Versatile Sporting Goods Company |
289 |
17691.83 |
Europe |
DE |
Versatile Sporting Goods Company |
289 |
17691.83 |
4. 연결된 ROLLUP 연산에 GROUP BY 사용
다음 예에서는 두 ROLLUP 연산의 교차곱을 반환합니다.
USE AdventureWorks2008R2;
GO
SELECT T.[Group] AS N'Region', T.CountryRegionCode AS N'Country'
,DATEPART(yyyy,OrderDate) AS 'Year'
,DATEPART(mm,OrderDate) AS 'Month'
,SUM(TotalDue) AS N'Total Sales'
FROM Sales.Customer C
INNER JOIN Sales.Store S
ON C.StoreID = S.BusinessEntityID
INNER JOIN Sales.SalesTerritory T
ON C.TerritoryID = T.TerritoryID
INNER JOIN Sales.SalesOrderHeader H
ON C.CustomerID = H.CustomerID
WHERE T.[Group] = N'Europe'
AND T.CountryRegionCode IN(N'DE', N'FR')
AND DATEPART(yyyy,OrderDate) = '2006'
GROUP BY
ROLLUP(T.[Group], T.CountryRegionCode)
,ROLLUP(DATEPART(yyyy,OrderDate), DATEPART(mm,OrderDate))
ORDER BY T.[Group], T.CountryRegionCode
,DATEPART(yyyy,OrderDate), DATEPART(mm,OrderDate);
결과 집합은 다음과 같습니다.
Region |
Country |
Year |
Month |
Total Sales |
---|---|---|---|---|
NULL |
NULL |
NULL |
NULL |
966221.9606 |
NULL |
NULL |
2006 |
NULL |
966221.9606 |
NULL |
NULL |
2006 |
7 |
109936.0248 |
NULL |
NULL |
2006 |
8 |
296651.4808 |
NULL |
NULL |
2006 |
9 |
184477.7563 |
NULL |
NULL |
2006 |
10 |
62792.5455 |
NULL |
NULL |
2006 |
11 |
213238.0125 |
NULL |
NULL |
2006 |
12 |
99126.1407 |
Europe |
NULL |
NULL |
NULL |
966221.9606 |
Europe |
NULL |
2006 |
NULL |
966221.9606 |
Europe |
NULL |
2006 |
7 |
109936.0248 |
Europe |
NULL |
2006 |
8 |
296651.4808 |
Europe |
NULL |
2006 |
9 |
184477.7563 |
Europe |
NULL |
2006 |
10 |
62792.5455 |
Europe |
NULL |
2006 |
11 |
213238.0125 |
Europe |
NULL |
2006 |
12 |
99126.1407 |
Europe |
FR |
NULL |
NULL |
966221.9606 |
Europe |
FR |
2006 |
NULL |
966221.9606 |
Europe |
FR |
2006 |
7 |
109936.0248 |
Europe |
FR |
2006 |
8 |
296651.4808 |
Europe |
FR |
2006 |
9 |
184477.7563 |
Europe |
FR |
2006 |
10 |
62792.5455 |
Europe |
FR |
2006 |
11 |
213238.0125 |
Europe |
FR |
2006 |
12 |
99126.1407 |
5. GROUP BY CUBE 사용
다음 예에서는 CUBE 연산자가 CUBE 목록과 총합계 그룹화에 있는 열의 모든 가능한 조합에 대한 그룹화가 하나만 포함된 결과 집합을 반환합니다.
USE AdventureWorks2008R2;
GO
SELECT T.[Group] AS N'Region', T.CountryRegionCode AS N'Country'
,S.Name AS N'Store', H.SalesPersonID
,SUM(TotalDue) AS N'Total Sales'
FROM Sales.Customer AS C
INNER JOIN Sales.Store AS S
ON C.StoreID = S.BusinessEntityID
INNER JOIN Sales.SalesTerritory AS T
ON C.TerritoryID = T.TerritoryID
INNER JOIN Sales.SalesOrderHeader AS H
ON C.CustomerID = H.CustomerID
WHERE T.[Group] = N'Europe'
AND T.CountryRegionCode IN(N'DE', N'FR')
AND H.SalesPersonID IN(287, 288, 290)
AND SUBSTRING(S.Name,1,4)IN(N'Vers', N'Spa ')
GROUP BY CUBE(
T.[Group], T.CountryRegionCode, S.Name, H.SalesPersonID)
ORDER BY T.[Group], T.CountryRegionCode, S.Name, H.SalesPersonID;
결과 집합은 다음과 같습니다.
Region |
Country |
Store |
SalesPersonID |
Total Sales |
---|---|---|---|---|
NULL |
NULL |
NULL |
NULL |
254013.6014 |
NULL |
NULL |
NULL |
287 |
28461.1854 |
NULL |
NULL |
NULL |
288 |
17073.0655 |
NULL |
NULL |
NULL |
290 |
208479.3505 |
NULL |
NULL |
Spa and Exercise Outfitters |
NULL |
236210.9015 |
NULL |
NULL |
Spa and Exercise Outfitters |
287 |
27731.551 |
NULL |
NULL |
Spa and Exercise Outfitters |
290 |
208479.3505 |
NULL |
NULL |
Versatile Sporting Goods Company |
NULL |
17802.6999 |
NULL |
NULL |
Versatile Sporting Goods Company |
287 |
729.6344 |
NULL |
NULL |
Versatile Sporting Goods Company |
288 |
17073.0655 |
NULL |
DE |
NULL |
NULL |
17802.6999 |
NULL |
DE |
NULL |
287 |
729.6344 |
NULL |
DE |
NULL |
288 |
17073.0655 |
NULL |
DE |
Versatile Sporting Goods Company |
NULL |
17802.6999 |
NULL |
DE |
Versatile Sporting Goods Company |
287 |
729.6344 |
NULL |
DE |
Versatile Sporting Goods Company |
288 |
17073.0655 |
NULL |
FR |
NULL |
NULL |
236210.9015 |
NULL |
FR |
NULL |
287 |
27731.551 |
NULL |
FR |
NULL |
290 |
208479.3505 |
NULL |
FR |
Spa and Exercise Outfitters |
NULL |
236210.9015 |
NULL |
FR |
Spa and Exercise Outfitters |
287 |
27731.551 |
NULL |
FR |
Spa and Exercise Outfitters |
290 |
208479.3505 |
Europe |
NULL |
NULL |
NULL |
254013.6014 |
Europe |
NULL |
NULL |
287 |
28461.1854 |
Europe |
NULL |
NULL |
288 |
17073.0655 |
Europe |
NULL |
NULL |
290 |
208479.3505 |
Europe |
NULL |
Spa and Exercise Outfitters |
NULL |
236210.9015 |
Europe |
NULL |
Spa and Exercise Outfitters |
287 |
27731.551 |
Europe |
NULL |
Spa and Exercise Outfitters |
290 |
208479.3505 |
Europe |
NULL |
Versatile Sporting Goods Company |
NULL |
17802.6999 |
Europe |
NULL |
Versatile Sporting Goods Company |
287 |
729.6344 |
Europe |
NULL |
Versatile Sporting Goods Company |
288 |
17073.0655 |
Europe |
DE |
NULL |
NULL |
17802.6999 |
Europe |
DE |
NULL |
287 |
729.6344 |
Europe |
DE |
NULL |
288 |
17073.0655 |
Europe |
DE |
Versatile Sporting Goods Company |
NULL |
17802.6999 |
Europe |
DE |
Versatile Sporting Goods Company |
287 |
729.6344 |
Europe |
DE |
Versatile Sporting Goods Company |
288 |
17073.0655 |
Europe |
FR |
NULL |
NULL |
236210.9015 |
Europe |
FR |
NULL |
287 |
27731.551 |
Europe |
FR |
NULL |
290 |
208479.3505 |
Europe |
FR |
Spa and Exercise Outfitters |
NULL |
236210.9015 |
Europe |
FR |
Spa and Exercise Outfitters |
287 |
27731.551 |
Europe |
FR |
Spa and Exercise Outfitters |
290 |
208479.3505 |
6. 복합 요소에 CUBE 사용
다음 예에서는 CUBE 연산자가 CUBE 목록과 총합계 그룹화에 있는 열의 모든 가능한 조합에 대한 그룹화가 하나만 포함된 결과 집합을 반환합니다.
연산자는 그룹화된 (T.[Group], T.CountryRegionCode) 및 (DATEPART(yyyy,OrderDate), DATEPART(mm,OrderDate)) 열을 하나의 열로 처리합니다.
USE AdventureWorks2008R2;
GO
SELECT T.[Group] AS N'Region', T.CountryRegionCode AS N'Country'
,DATEPART(yyyy,OrderDate) AS 'Year'
,DATEPART(mm,OrderDate) AS 'Month'
,SUM(TotalDue) AS N'Total Sales'
FROM Sales.Customer C
INNER JOIN Sales.Store S
ON C.StoreID = S.BusinessEntityID
INNER JOIN Sales.SalesTerritory T
ON C.TerritoryID = T.TerritoryID
INNER JOIN Sales.SalesOrderHeader H
ON C.CustomerID = H.CustomerID
WHERE T.[Group] = N'Europe'
AND T.CountryRegionCode IN(N'DE', N'FR')
AND DATEPART(yyyy,OrderDate) = '2006'
GROUP BY CUBE(
(T.[Group], T.CountryRegionCode)
,(DATEPART(yyyy,OrderDate), DATEPART(mm,OrderDate)))
ORDER BY T.[Group], T.CountryRegionCode
,DATEPART(yyyy,OrderDate), DATEPART(mm,OrderDate);
결과 집합은 다음과 같습니다.
Region |
Country |
Year |
Month |
Total Sales |
---|---|---|---|---|
NULL |
NULL |
NULL |
NULL |
966221.9606 |
NULL |
NULL |
2006 |
7 |
109936.0248 |
NULL |
NULL |
2006 |
8 |
296651.4808 |
NULL |
NULL |
2006 |
9 |
184477.7563 |
NULL |
NULL |
2006 |
10 |
62792.5455 |
NULL |
NULL |
2006 |
11 |
213238.0125 |
NULL |
NULL |
2006 |
12 |
99126.1407 |
Europe |
FR |
NULL |
NULL |
966221.9606 |
Europe |
FR |
2006 |
7 |
109936.0248 |
Europe |
FR |
2006 |
8 |
296651.4808 |
Europe |
FR |
2006 |
9 |
184477.7563 |
Europe |
FR |
2006 |
10 |
62792.5455 |
Europe |
FR |
2006 |
11 |
213238.0125 |
Europe |
FR |
2006 |
12 |
99126.1407 |
7. GROUPING SETS에 GROUP BY 사용
다음 예에서는 GROUPING SETS 연산자가 SELECT 목록의 각 열에 대해 하나씩 네 개의 그룹화를 갖습니다. 이 연산자는 Region, Country, Store, 및 SalesPersonID 열의 각 고유한 값에 대해 행을 하나씩 반환합니다.
USE AdventureWorks2008R2;
GO
SELECT T.[Group] AS N'Region', T.CountryRegionCode AS N'Country'
,S.Name AS N'Store', H.SalesPersonID
,SUM(TotalDue) AS N'Total Sales'
FROM Sales.Customer C
INNER JOIN Sales.Store AS S
ON C.StoreID = S.BusinessEntityId
INNER JOIN Sales.SalesTerritory AS T
ON C.TerritoryID = T.TerritoryID
INNER JOIN Sales.SalesOrderHeader AS H
ON C.CustomerID = H.CustomerID
WHERE T.[Group] = N'Europe'
AND T.CountryRegionCode IN(N'DE', N'FR')
AND H.SalesPersonID IN(287, 288, 290)
AND SUBSTRING(S.Name,1,4)IN(N'Vers', N'Spa ')
GROUP BY GROUPING SETS
(T.[Group], T.CountryRegionCode, S.Name, H.SalesPersonID)
ORDER BY T.[Group], T.CountryRegionCode, S.Name, H.SalesPersonID;
결과 집합은 다음과 같습니다.
Region |
Country |
Store |
SalesPersonID |
Total Sales |
---|---|---|---|---|
NULL |
NULL |
NULL |
287 |
28461.1854 |
NULL |
NULL |
NULL |
288 |
17073.0655 |
NULL |
NULL |
NULL |
290 |
208479.3505 |
NULL |
NULL |
Spa and Exercise Outfitters |
NULL |
236210.9015 |
NULL |
NULL |
Versatile Sporting Goods Company |
NULL |
17802.6999 |
NULL |
DE |
NULL |
NULL |
17802.6999 |
NULL |
FR |
NULL |
NULL |
236210.9015 |
Europe |
NULL |
NULL |
NULL |
254013.6014 |
8. 복합 요소에 GROUPING SETS 사용
다음 예에서는 GROUPING SETS 목록에 (T.[Group], T.CountryRegionCode) 및 (DATEPART(yyyy,OrderDate), DATEPART(mm,OrderDate))라는 두 개의 복합 요소를 포함합니다. 각 복합 요소는 하나의 열로 처리됩니다.
USE AdventureWorks2008R2;
GO
SELECT T.[Group] AS N'Region', T.CountryRegionCode AS N'Country'
,DATEPART(yyyy,OrderDate) AS 'Year'
,DATEPART(mm,OrderDate) AS 'Month'
,SUM(TotalDue) AS N'Total Sales'
FROM Sales.Customer C
INNER JOIN Sales.Store AS S
ON C.StoreID = S.BusinessEntityID
INNER JOIN Sales.SalesTerritory AS T
ON C.TerritoryID = T.TerritoryID
INNER JOIN Sales.SalesOrderHeader AS H
ON C.CustomerID = H.CustomerID
WHERE T.[Group] = N'Europe'
AND T.CountryRegionCode IN(N'DE', N'FR')
AND DATEPART(yyyy,OrderDate) = '2006'
GROUP BY GROUPING SETS(
(T.[Group], T.CountryRegionCode)
,(DATEPART(yyyy,OrderDate), DATEPART(mm,OrderDate)))
ORDER BY T.[Group], T.CountryRegionCode
,DATEPART(yyyy,OrderDate), DATEPART(mm,OrderDate);
결과 집합은 다음과 같습니다.
Region |
Country |
Year |
Month |
Total Sales |
---|---|---|---|---|
NULL |
NULL |
2006 |
7 |
109936.0248 |
NULL |
NULL |
2006 |
8 |
296651.4808 |
NULL |
NULL |
2006 |
9 |
184477.7563 |
NULL |
NULL |
2006 |
10 |
62792.5455 |
NULL |
NULL |
2006 |
11 |
213238.0125 |
NULL |
NULL |
2006 |
12 |
99126.1407 |
Europe |
FR |
NULL |
NULL |
966221.9606 |
9. 여러 GROUPING SETS에 GROUP BY 사용
다음 예에서는 GROUPING SETS 목록에 다섯 개의 요소를 포함합니다. 결과 집합에는 다음 요소에 대한 행이 하나씩 있습니다.
Region 및 Country 열에 있는 값의 각 고유 조합
Store 열에 있는 고유한 각 값
SalesPersonID 및 Region 열에 있는 값의 각 고유 조합
SalesPersonID 열에 있는 고유한 각 값
총합계
USE AdventureWorks2008R2;
GO
SELECT T.[Group] AS N'Region', T.CountryRegionCode AS N'Country'
,S.Name AS N'Store', H.SalesPersonID
,SUM(TotalDue) AS N'Total Sales'
FROM Sales.Customer C
INNER JOIN Sales.Store AS S
ON C.StoreID = S.BusinessEntityID
INNER JOIN Sales.SalesTerritory AS T
ON C.TerritoryID = T.TerritoryID
INNER JOIN Sales.SalesOrderHeader AS H
ON C.CustomerID = H.CustomerID
WHERE T.[Group] = N'Europe'
AND T.CountryRegionCode IN(N'DE', N'FR')
AND H.SalesPersonID IN(287, 288, 290)
AND SUBSTRING(S.Name,1,4)IN(N'Vers', N'Spa ')
GROUP BY GROUPING SETS(
(T.[Group], T.CountryRegionCode)
,(S.Name)
,(H.SalesPersonID,T.[Group])
,(H.SalesPersonID)
,())
ORDER BY T.[Group], T.CountryRegionCode, S.Name, H.SalesPersonID;
결과 집합은 다음과 같습니다.
Region |
Country |
Store |
SalesPersonID |
Total Sales |
---|---|---|---|---|
NULL |
NULL |
NULL |
NULL |
254013.6014 |
NULL |
NULL |
NULL |
287 |
28461.1854 |
NULL |
NULL |
NULL |
288 |
17073.0655 |
NULL |
NULL |
NULL |
290 |
208479.3505 |
NULL |
NULL |
Spa and Exercise Outfitters |
NULL |
236210.9015 |
NULL |
NULL |
Versatile Sporting Goods Company |
NULL |
17802.6999 |
Europe |
NULL |
NULL |
287 |
28461.1854 |
Europe |
NULL |
NULL |
288 |
17073.0655 |
Europe |
NULL |
NULL |
290 |
208479.3505 |
Europe |
DE |
NULL |
NULL |
17802.6999 |
Europe |
FR |
NULL |
NULL |
236210.9015 |
10. GROUP BY 목록에 포함된 ROLLUP에 GROUPING SETS 사용
다음 예에서는 GROUPING SETS 목록에 T.[Group] 및 T.CountryRegionCode 열에 대한 그룹화와 S.Name 및 H.SalesPersonID 열의 ROLLUP을 포함합니다.
USE AdventureWorks2008R2;
GO
SELECT T.[Group] AS N'Region', T.CountryRegionCode AS N'Country'
,S.Name AS N'Store', H.SalesPersonID
,SUM(TotalDue) AS N'Total Sales'
FROM Sales.Customer C
INNER JOIN Sales.Store AS S
ON C.StoreID = S.BusinessEntityID
INNER JOIN Sales.SalesTerritory AS T
ON C.TerritoryID = T.TerritoryID
INNER JOIN Sales.SalesOrderHeader AS H
ON C.CustomerID = H.CustomerID
WHERE T.[Group] = N'Europe'
AND T.CountryRegionCode IN(N'DE', N'FR')
AND H.SalesPersonID IN(287, 288, 290)
AND SUBSTRING(S.Name,1,4)IN(N'Vers', N'Spa ')
GROUP BY GROUPING SETS(
T.[Group], T.CountryRegionCode
,ROLLUP(S.Name, H.SalesPersonID))
ORDER BY T.[Group], T.CountryRegionCode, S.Name, H.SalesPersonID;
결과 집합은 다음과 같습니다.
Region |
Country |
Store |
SalesPersonID |
Total Sales |
---|---|---|---|---|
NULL |
NULL |
NULL |
NULL |
254013.6014 |
NULL |
NULL |
Spa and Exercise Outfitters |
NULL |
236210.9015 |
NULL |
NULL |
Spa and Exercise Outfitters |
287 |
27731.551 |
NULL |
NULL |
Spa and Exercise Outfitters |
290 |
208479.3505 |
NULL |
NULL |
Versatile Sporting Goods Company |
NULL |
17802.6999 |
NULL |
NULL |
Versatile Sporting Goods Company |
287 |
729.6344 |
NULL |
NULL |
Versatile Sporting Goods Company |
288 |
17073.0655 |
NULL |
DE |
NULL |
NULL |
17802.6999 |
NULL |
FR |
NULL |
NULL |
236210.9015 |
Europe |
NULL |
NULL |
NULL |
254013.6014 |
11. GROUP BY 목록에 포함된 CUBE에 GROUPING SETS 사용
다음 예에서는 GROUPING SETS 목록에 T.[Group] 및 T.CountryRegionCode 열에 대한 그룹화와 S.Name 및 H.SalesPersonID 열의 CUBE를 포함합니다.
USE AdventureWorks2008R2;
GO
SELECT T.[Group] AS N'Region', T.CountryRegionCode AS N'Country'
,S.Name AS N'Store', H.SalesPersonID
,SUM(TotalDue) AS N'Total Sales'
FROM Sales.Customer C
INNER JOIN Sales.Store AS S
ON C.StoreID = S.BusinessEntityID
INNER JOIN Sales.SalesTerritory AS T
ON C.TerritoryID = T.TerritoryID
INNER JOIN Sales.SalesOrderHeader AS H
ON C.CustomerID = H.CustomerID
WHERE T.[Group] = N'Europe'
AND T.CountryRegionCode IN(N'DE', N'FR')
AND H.SalesPersonID IN(287, 288, 290)
AND SUBSTRING(S.Name,1,4)IN(N'Vers', N'Spa ')
GROUP BY GROUPING SETS(
T.[Group], T.CountryRegionCode
,CUBE(S.Name, H.SalesPersonID))
ORDER BY T.[Group], T.CountryRegionCode, S.Name, H.SalesPersonID;
결과 집합은 다음과 같습니다.
Region |
Country |
Store |
SalesPersonID |
Total Sales |
---|---|---|---|---|
NULL |
NULL |
NULL |
NULL |
254013.6014 |
NULL |
NULL |
NULL |
287 |
28461.1854 |
NULL |
NULL |
NULL |
288 |
17073.0655 |
NULL |
NULL |
NULL |
290 |
208479.3505 |
NULL |
NULL |
Spa and Exercise Outfitters |
NULL |
236210.9015 |
NULL |
NULL |
Spa and Exercise Outfitters |
287 |
27731.551 |
NULL |
NULL |
Spa and Exercise Outfitters |
290 |
208479.3505 |
NULL |
NULL |
Versatile Sporting Goods Company |
NULL |
17802.6999 |
NULL |
NULL |
Versatile Sporting Goods Company |
287 |
729.6344 |
NULL |
NULL |
Versatile Sporting Goods Company |
288 |
17073.0655 |
NULL |
DE |
NULL |
NULL |
17802.6999 |
NULL |
FR |
NULL |
NULL |
236210.9015 |
Europe |
NULL |
NULL |
NULL |
254013.6014 |