Verwenden von GROUP BY mit ROLLUP, CUBE und GROUPING SETS

Die Operatoren ROLLUP, CUBE und GROUPING SETS sind Erweiterungen der GROUP BY-Klausel. Die Operatoren ROLLUP, CUBE und GROUPING SETS können das gleiche Resultset generieren wie die Verwendung von UNION ALL zum Kombinieren von einzelnen Gruppierungsabfragen. Die Verwendung eines der GROUP BY-Operatoren ist jedoch normalerweise effizienter.

Der GROUPING SETS-Operator kann das gleiche Resultset generieren wie die Verwendung eines einfachen GROUP BY-, ROLLUP- oder CUBE-Operators. Wenn alle Gruppierungen, die mithilfe eines vollständigen ROLLUP- oder CUBE-Operators generiert wurden, nicht erforderlich sind, können Sie mit GROUPING SETS nur die gewünschten Gruppierungen angeben. Die GROUPING SETS-Liste kann doppelte Gruppierungen enthalten. Wenn GROUPING SETS mit ROLLUP und CUBE verwendet wird, werden möglicherweise doppelte Gruppierungen generiert. Doppelte Gruppierungen werden wie bei der Verwendung von UNION ALL beibehalten.

HinweisHinweis

CUBE, ROLLUP und GROUPING SETS unterstützen die CHECKSUM_AGG-Funktion nicht.

Zusammengesetzte und verkettete Elemente

Mehrere Spalten, die in inneren Klammern in derGROUPING SETS-Liste aufgeführt sind, werden als ein Satz behandelt. In der Klausel GROUP BY GROUPING SETS ((Colum1, Column2), Column3, Column4) werden z. B. Column1 und Column2 als eine Spalte betrachtet. Ein Beispiel für die Verwendung von GROUPING SETS mit zusammengesetzten Elementen finden Sie in Beispiel H weiter unten in diesem Thema.

Wenn die GROUPING SETS-Liste mehrere Sätze in inneren Klammern enthält, die durch Kommas getrennt sind, werden die Ausgaben der Sätze verkettet. Das Resultset ist das Kreuzprodukt oder das kartesische Produkt der Gruppierungssätze. Ein Beispiel für die Verwendung von GROUP BY mit verketteten ROLLUP-Vorgängen finden Sie in Beispiel D weiter unten in diesem Thema.

ROLLUP und CUBE im Vergleich mit OLAP-Dimensionen

Abfragen, die den ROLLUP-Operator und den CUBE-Operator verwenden, generieren z. T. die gleichen Resultsets und führen z. T. die gleichen Berechnungen wie OLAP-Anwendungen aus. Der CUBE-Operator generiert ein Resultset, das für Kreuztabellenberichte verwendet werden kann. Mit einem ROLLUP-Vorgang kann die Entsprechung einer OLAP-Dimension oder -Hierarchie berechnet werden.

Bei einer Zeitdimension mit den Ebenen oder Attributen year, month und day generiert der folgende ROLLUP-Vorgang die folgenden Gruppierungen.

Vorgang

Gruppierungen

ROLLUP (DATEPART(yyyy,OrderDate)
    ,DATEPART(mm,OrderDate)
    ,DATEPART(dd,OrderDate)) 

year, month, day

year, month

year

()

Bei einer Ortsdimension mit den Ebenen region und city, die mit den Zeitddimensionsebenen year, month und day verkettet ist, gibt der folgende ROLLUP-Vorgang die folgenden Gruppierungen aus.

Vorgang

Gruppierungen

ROLLUP (region, city),
ROLLUP (DATEPART(yyyy,OrderDate)
    ,DATEPART(mm,OrderDate)
    ,DATEPART(dd,OrderDate))

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

()

Ein CUBE-Vorgang der gleichen Ebenen in der Orts- und Zeitdimension gibt die folgenden Gruppierungen aus.

Vorgang

Grouping

CUBE (region, city
    ,DATEPART(yyyy,OrderDate)
    ,DATEPART(mm,OrderDate)
    ,DATEPART(dd,OrderDate))

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 in Resultsets

In den Resultsets, die von den GROUP BY-Operatoren generiert werden, hat NULL die folgenden Verwendungen:

  • Wenn eine Gruppierungsspalte NULL enthält, werden alle NULL-Werte als gleich betrachtet und in einer NULL-Gruppe zusammengefasst.

  • Wenn eine Spalte in einer Zeile aggregiert wird, wird der Wert der Spalte als NULL angezeigt.

Im folgenden Beispiel werden die beiden Verwendungen von NULL mithilfe der GROUPING-Funktion veranschaulicht. UNKNOWN ersetzt NULL in Zeilen, in denen die NULL-Werte in einer Spalte gruppiert wurden. ALL ersetzt NULL in einer Spalte, in der NULL angibt, dass eine Spalte in eine Aggregation eingeschlossen wurde.

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

Dies ist das Resultset.

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

Februar

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

Februar

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

BEISPIELE

In den Beispielen in diesem Abschnitt wird die SUM-Aggregatfunktion verwendet, damit die Resultsets verglichen werden können. Die anderen Aggregatfunktionen könnten ebenfalls verwendet werden, um andere Zusammenfassungen zu berechnen.

A. Verwenden einer einfachen GROUP BY-Klausel

Im folgenden Beispiel gibt das einfache GROUP BY ein Resultset für den Vergleich mit den Resultsets der Beispiele B bis K zurück. In diesen Beispielen werden die GROUP BY-Operatoren mit derselben SELECT-Anweisung verwendet.

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;

Dies ist das Resultset.

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

B. Verwenden von GROUP BY ROLLUP

Im folgenden Beispiel gibt der ROLLUP-Operator ein Resultset zurück, das die folgenden Gruppierungen enthält:

  • Region, Country, Store und SalesPersonID

  • Region, Country und Store

  • Region und Country

  • Region

  • Gesamtsumme

Die Anzahl der von ROLLUP generierten Gruppierungen entspricht der Anzahl der Spalten in der ROLLUP-Liste plus einer Gruppierung für die Gesamtsumme. Die Anzahl der Zeilen in einer Gruppierung wird von der Anzahl der eindeutigen Wertkombinationen in den Spalten der Gruppierung bestimmt.

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;

Dies ist das Resultset.

Region

Country

Geschäft

SalesPersonID

Total Sales

NULL

NULL

NULL

NULL

297597.8

Europa

NULL

NULL

NULL

297597.8

Europa

DE

NULL

NULL

18551.07

Europa

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

C. Verwenden von GROUP BY ROLLUP mit umgekehrter Spaltenreihenfolge

Im folgenden Beispiel gibt der ROLLUP-Operator ein Resultset zurück, das die folgenden Gruppierungen enthält:

  • SalesPersonID, Store, Country und Region

  • SalesPersonID, Store und Country

  • SalesPersonID und Store

  • SalesPersonID

  • Gesamtsumme

Die Spalten in der ROLLUP-Liste entsprechen denen in Beispiel B, jedoch in umgekehrter Reihenfolge. Das Rollup der Spalten wird von rechts nach links ausgeführt. Die Reihenfolge hat daher Auswirkungen auf die Gruppierungen. Die Anzahl der Zeilen im Resultset kann abhängig von der Spaltenreihenfolge anders lauten.

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

Dies ist das Resultset.

Region

Country

Geschäft

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

D. Verwenden von GROUP BY mit verketteten ROLLUP-Vorgängen

Im folgenden Beispiel wird das Kreuzprodukt der beiden ROLLUP-Vorgänge zurückgegeben.

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

Dies ist das Resultset.

Region

Land

Jahr

Monat

Gesamtumsatz

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

Europa

NULL

NULL

NULL

966221.9606

Europa

NULL

2006

NULL

966221.9606

Europa

NULL

2006

7

109936.0248

Europa

NULL

2006

8

296651.4808

Europa

NULL

2006

9

184477.7563

Europa

NULL

2006

10

62792.5455

Europa

NULL

2006

11

213238.0125

Europa

NULL

2006

12

99126.1407

Europa

FR

NULL

NULL

966221.9606

Europa

FR

2006

NULL

966221.9606

Europa

FR

2006

7

109936.0248

Europa

FR

2006

8

296651.4808

Europa

FR

2006

9

184477.7563

Europa

FR

2006

10

62792.5455

Europa

FR

2006

11

213238.0125

Europa

FR

2006

12

99126.1407

E. Verwenden von GROUP BY CUBE

Im folgenden Beispiel gibt der CUBE-Operator ein Resultset mit einer Gruppierung für alle möglichen Kombinationen von Spalten in der CUBE-Liste sowie eine Gruppierung für die Gesamtsumme zurück.

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;

Dies ist das Resultset.

Region

Land

Geschäft

Vertriebsmitarbeiter-ID

Gesamtumsatz

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- und Trainingsausrüstung

NULL

236210.9015

NULL

NULL

Spa- und Trainingsausrüstung

287

27731.551

NULL

NULL

Spa- und Trainingsausrüstung

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- und Trainingsausrüstung

NULL

236210.9015

NULL

FR

Spa- und Trainingsausrüstung

287

27731.551

NULL

FR

Spa- und Trainingsausrüstung

290

208479.3505

Europa

NULL

NULL

NULL

254013.6014

Europa

NULL

NULL

287

28461.1854

Europa

NULL

NULL

288

17073.0655

Europa

NULL

NULL

290

208479.3505

Europa

NULL

Spa- und Trainingsausrüstung

NULL

236210.9015

Europa

NULL

Spa- und Trainingsausrüstung

287

27731.551

Europa

NULL

Spa- und Trainingsausrüstung

290

208479.3505

Europa

NULL

Versatile Sporting Goods Company

NULL

17802.6999

Europa

NULL

Versatile Sporting Goods Company

287

729.6344

Europa

NULL

Versatile Sporting Goods Company

288

17073.0655

Europa

DE

NULL

NULL

17802.6999

Europa

DE

NULL

287

729.6344

Europa

DE

NULL

288

17073.0655

Europa

DE

Versatile Sporting Goods Company

NULL

17802.6999

Europa

DE

Versatile Sporting Goods Company

287

729.6344

Europa

DE

Versatile Sporting Goods Company

288

17073.0655

Europa

FR

NULL

NULL

236210.9015

Europa

FR

NULL

287

27731.551

Europa

FR

NULL

290

208479.3505

Europa

FR

Spa- und Trainingsausrüstung

NULL

236210.9015

Europa

FR

Spa- und Trainingsausrüstung

287

27731.551

Europa

FR

Spa- und Trainingsausrüstung

290

208479.3505

F. Verwenden von CUBE mit zusammengesetzten Elementen

Im folgenden Beispiel gibt der CUBE-Operator ein Resultset mit einer Gruppierung für alle möglichen Kombinationen von Spalten in der CUBE-Liste sowie eine Gruppierung für die Gesamtsumme zurück.

Der Operator verarbeitet die gruppierten Spalten (T.[Group], T.CountryRegionCode) und (DATEPART(yyyy,OrderDate), DATEPART(mm,OrderDate)) jeweils als einzelne Spalte.

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

Dies ist das Resultset.

Region

Land

Jahr

Monat

Gesamtumsatz

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

Europa

FR

NULL

NULL

966221.9606

Europa

FR

2006

7

109936.0248

Europa

FR

2006

8

296651.4808

Europa

FR

2006

9

184477.7563

Europa

FR

2006

10

62792.5455

Europa

FR

2006

11

213238.0125

Europa

FR

2006

12

99126.1407

G. Verwenden von GROUP BY mit GROUPING SETS

Im folgenden Beispiel weist der GROUPING SETS-Operator vier Gruppierungen auf, eine für jede Spalte in der SELECT-Liste. Der Operator gibt eine Zeile für jeden eindeutigen Wert in den Spalten Region, Country, Store, und SalesPersonID zurück.

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;

Dies ist das Resultset.

Region

Land

Geschäft

Vertriebsmitarbeiter-ID

Gesamtumsatz

NULL

NULL

NULL

287

28461.1854

NULL

NULL

NULL

288

17073.0655

NULL

NULL

NULL

290

208479.3505

NULL

NULL

Spa- und Trainingsausrüstung

NULL

236210.9015

NULL

NULL

Versatile Sporting Goods Company

NULL

17802.6999

NULL

DE

NULL

NULL

17802.6999

NULL

FR

NULL

NULL

236210.9015

Europa

NULL

NULL

NULL

254013.6014

H. Verwenden von GROUPING SETS mit zusammengesetzten Elementen

Im folgenden Beispiel enthält die GROUPING SETS-Liste die beiden zusammengesetzten Elemente (T.[Group], T.CountryRegionCode) und (DATEPART(yyyy,OrderDate), DATEPART(mm,OrderDate)). Jedes zusammengesetzte Element wird als eine Spalte behandelt.

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

Dies ist das Resultset.

Region

Land

Jahr

Monat

Gesamtumsatz

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

Europa

FR

NULL

NULL

966221.9606

I. Verwenden von GROUP BY mit mehreren GROUPING SETS

Im folgenden Beispiel enthält die GROUPING SETS-Liste fünf Elemente. Das Resultset weist eine Zeile für die folgenden Elemente auf:

  • Jede eindeutige Kombination der Werte in den Spalten Region und Country

  • Jeder eindeutige Wert in der Spalte Store

  • Jede eindeutige Kombination der Werte in den Spalten SalesPersonID und Region

  • Jeder eindeutige Wert in der Spalte SalesPersonID

  • Eine Gesamtsumme

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;

Dies ist das Resultset.

Region

Land

Geschäft

Vertriebsmitarbeiter-ID

Gesamtumsatz

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- und Trainingsausrüstung

NULL

236210.9015

NULL

NULL

Versatile Sporting Goods Company

NULL

17802.6999

Europa

NULL

NULL

287

28461.1854

Europa

NULL

NULL

288

17073.0655

Europa

NULL

NULL

290

208479.3505

Europa

DE

NULL

NULL

17802.6999

Europa

FR

NULL

NULL

236210.9015

J. Verwenden von GROUPING SETS mit einem ROLLUP eines Teils der GROUP BY-Liste

Im folgenden Beispiel umfasst die GROUPING SETS-Liste Gruppierungen für die Spalten T.[Group] und T.CountryRegionCode und ein ROLLUP der Spalten S.Name und H.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
   ,ROLLUP(S.Name, H.SalesPersonID))
ORDER BY T.[Group], T.CountryRegionCode, S.Name, H.SalesPersonID;

Dies ist das Resultset.

Region

Land

Geschäft

Vertriebsmitarbeiter-ID

Gesamtumsatz

NULL

NULL

NULL

NULL

254013.6014

NULL

NULL

Spa- und Trainingsausrüstung

NULL

236210.9015

NULL

NULL

Spa- und Trainingsausrüstung

287

27731.551

NULL

NULL

Spa- und Trainingsausrüstung

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

Europa

NULL

NULL

NULL

254013.6014

K. Verwenden von GROUPING SETS mit einem CUBE eines Teils der GROUP BY-Liste

Im folgenden Beispiel umfasst die GROUPING SETS-Liste Gruppierungen für die Spalten T.[Group] und T.CountryRegionCode und ein CUBE der Spalten S.Name und H.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
    ,CUBE(S.Name, H.SalesPersonID))
ORDER BY T.[Group], T.CountryRegionCode, S.Name, H.SalesPersonID;

Dies ist das Resultset.

Region

Land

Geschäft

Vertriebsmitarbeiter-ID

Gesamtumsatz

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- und Trainingsausrüstung

NULL

236210.9015

NULL

NULL

Spa- und Trainingsausrüstung

287

27731.551

NULL

NULL

Spa- und Trainingsausrüstung

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

Europa

NULL

NULL

NULL

254013.6014