Użycie klauzuli GROUP BY z operatorami ROLLUP, CUBE i klauzulą GROUPING SETS
Operatory ROLLUP, CUBE i GROUPING SETS są rozszerzeniami klauzuli GROUP BY.Operatory ROLLUP, CUBE lub GROUPING SETS mogą generować taki sam zestaw wyników, jak przy użyciu operatora UNION ALL do łączenia pojedynczego grupowania zapytań, jednak użycie jednego z operatorów klauzuli GROUP BY jest zwykle bardziej skuteczne.
Operator GROUPING SETS może wygenerować ten sam zestaw wyników jak wygenerowany przy użyciu prostych operatorów GROUP BY, ROLLUP lub CUBE.Jeśli nie wszystkie grupowania wygenerowane za pomocą pełnego operatora ROLLUP lub CUBE są wymagane, można użyć klauzuli GROUPING SETS, aby określić tylko żądane grupowania.Lista GROUPING SETS może zawierać zduplikowane grupowania; jeśli operacja GROUPING SETS używana jest z operatorami ROLLUP i CUBE, może generować zduplikowane grupowania.Zduplikowane grupowania są zachowywane, tak jak powinny przy użyciu operacji UNION ALL.
Ostrzeżenie
CUBE, ROLLUP i GROUPING SETS nie obsługują funkcji CHECKSUM_AGG.
Elementy złożone i połączone
Wiele kolumn w nawiasach wewnętrznych na liścieGROUPING SETS traktuje się jako pojedynczy zestaw.Na przykład w klauzuli GROUP BY GROUPING SETS ((Colum1, Column2), Column3, Column4), Column1 i Column2 są traktowane jako jedna kolumna.Aby zapoznać się z przykładem sposobu używania operacji GROUPING SETS z elementami złożonymi, zobacz przykład H dalej w tym temacie.
Jeśli operacja GROUPING SETS zawiera wiele zestawów w nawiasach wewnętrznych, oddzielonych przecinkami, dane wyjściowe zestawów są łączone.Zestaw wyników jest iloczynem wektorowym lub iloczynem kartezjańskim zestawów grupowania.Aby zapoznać się z przykładem używania klauzuli GROUP BY za pomocą połączonych operacji ROLLUP, zobacz przykład D dalej w tym temacie.
Operatory ROLLUP i CUBE w porównaniu do wymiarów OLAP
Kwerendy, które używają operatorów ROLLUP i CUBE, generują niektóre z tych samych zestawów wyników i wykonują niektóre takie same obliczenia jak aplikacje OLAP.Operator CUBE generuje zestaw wyników, który może być używany do raportów tabel krzyżowych.Operacja ROLLUP może obliczyć równoważnik wymiaru OLAP lub hierarchii.
Na przykład, biorąc pod uwagę wymiar czas z poziomów lub atrybuty rok, miesiąc i dzień; następująca ROLLUP operacja generuje następujące grupowania.
Operacja |
Grupowanie |
---|---|
|
year, month, day year, month year () |
Biorąc pod uwagę wymiar lokalizacja z poziomów region i miasto połączony z poziomem wymiaru czasu rok, miesiąc i dzień; następująca ROLLUP operacja generuje następujące grupowania.
Operacja |
Grupowanie |
---|---|
|
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 () |
A CUBE operacja tych samych poziomów z wymiaru miejsce i czas wyprowadza następujące grupowania.
Operacja |
Grupowanie |
---|---|
|
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 w zestawach wyników
W zestawach wyników generowanych przez grupy operator GROUP BY NULL ma następujące zastosowania:
Jeśli kolumna grupowania zawiera wartość NULL, wszystkie wartości null są uważane za równe, i są one wprowadzane do jednego grupowania NULL.
Gdy kolumna jest zagregowana w wierszu, wartość kolumny jest wyświetlana jako NULL.
W poniższym przykładzie użyto funkcji GROUPING, aby pokazać dwa zastosowania wartości NULL.UNKNOWN zastępuje NULL w wierszach, gdzie wartości null w kolumnie zostały pogrupowane.ALL zastępuje NULL w kolumnie, gdzie NULL wskazuje, że kolumna została ujęta w agregacji.
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);
Oto zestaw wyników.
Sklep |
Rok_sprzedaz |
Miesiac_Sprzedaz |
Count |
---|---|---|---|
Nieznany |
Nieznany |
Nieznany |
1 |
Nieznany |
Nieznany |
Styczeń |
1 |
Nieznany |
Nieznany |
ALL |
2 |
Nieznany |
2002 |
Nieznany |
1 |
Nieznany |
2002 |
ALL |
1 |
Nieznany |
ALL |
ALL |
3 |
Aktywne Kolarstwo |
Nieznany |
Nieznany |
1 |
Aktywne Kolarstwo |
Nieznany |
Styczeń |
2 |
Aktywne Kolarstwo |
Nieznany |
ALL |
3 |
Aktywne Kolarstwo |
2002 |
Nieznany |
1 |
Aktywne Kolarstwo |
2002 |
ALL |
1 |
Aktywne Kolarstwo |
2003 |
Nieznany |
1 |
Aktywne Kolarstwo |
2003 |
Luty |
1 |
Aktywne Kolarstwo |
2003 |
ALL |
2 |
Aktywne Kolarstwo |
ALL |
ALL |
6 |
Sklep z rowerami górskimi |
Nieznany |
Nieznany |
1 |
Sklep z rowerami górskimi |
Nieznany |
ALL |
1 |
Sklep z rowerami górskimi |
2002 |
Nieznany |
1 |
Sklep z rowerami górskimi |
2002 |
Styczeń |
1 |
Sklep z rowerami górskimi |
2002 |
ALL |
2 |
Sklep z rowerami górskimi |
2003 |
Luty |
1 |
Sklep z rowerami górskimi |
2003 |
Styczeń |
1 |
Sklep z rowerami górskimi |
2003 |
Marzec |
1 |
Sklep z rowerami górskimi |
2003 |
ALL |
3 |
Sklep z rowerami górskimi |
ALL |
ALL |
6 |
ALL |
ALL |
ALL |
15 |
PRZYKŁADY
Przykłady podane w tej sekcji używają funkcji agregującej SUM tak, aby zestawy wyników mogły być porównane.Inne funkcje agregujące mogą być także używane do obliczania różnych podsumowań.
A.Używanie prostego operatora GROUP BY
W poniższym przykładzie prosty GROUP BY zwraca zestaw wyników w celu porównania z zestawem wyników z przykładów od B do K.W tych przykładach wykorzystano operatory GROUP BY i tą samą instrukcją SELECT.
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;
Oto zestaw wyników.
Region |
Country |
Sklep |
ID_sprzedawcy |
Łączna sprzedaż |
---|---|---|---|---|
Europa |
DE |
Wszechstronna firma towarów sportowych |
284 |
859.232 |
Europa |
DE |
Wszechstronna firma towarów sportowych |
289 |
17691.83 |
Europa |
FR |
Dostawcy SPA i ćwiczeń |
284 |
32774.36 |
Europa |
FR |
Dostawcy SPA i ćwiczeń |
286 |
246272.4 |
B.Przy użyciu GROUP BY ROLLUP
W poniższym przykładzie operator ROLLUP zwraca zestaw wyników, który zawiera następujące grupowania:
Region, Country, Store i SalesPersonID
Region, Country i Store
Regionoraz Country
Region
suma końcowa
Liczba grupowań generowanych przez ROLLUP jest taka sama jak liczba kolumn na liście ROLLUP oraz suma całkowita grupowania.Liczba wierszy i kolumn w grupowaniach jest określana przez liczbę unikatowych połączeń wartości w kolumnach grupowania.
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;
Oto zestaw wyników.
Region |
Country |
Sklep |
ID_sprzedawcy |
Łączna sprzedaż |
---|---|---|---|---|
NULL |
NULL |
NULL |
NULL |
297597.8 |
Europa |
NULL |
NULL |
NULL |
297597.8 |
Europa |
DE |
NULL |
NULL |
18551.07 |
Europa |
DE |
Wszechstronna firma towarów sportowych |
NULL |
18551.07 |
Europa |
DE |
Wszechstronna firma towarów sportowych |
284 |
859.232 |
Europa |
DE |
Wszechstronna firma towarów sportowych |
289 |
17691.83 |
Europa |
FR |
NULL |
NULL |
279046.8 |
Europa |
FR |
Dostawcy SPA i ćwiczeń |
NULL |
279046.8 |
Europa |
FR |
Dostawcy SPA i ćwiczeń |
284 |
32774.36 |
Europa |
FR |
Dostawcy SPA i ćwiczeń |
286 |
246272.4 |
C.Użycie GROUP BY ROLLUP z odwróconym porządkiem kolumn
W poniższym przykładzie operator ROLLUP zwraca zestaw wyników, który zawiera następujące grupowania:
SalesPersonID, Store, Country i Region
SalesPersonID, Store i Country
SalesPersonIDoraz Store
SalesPersonID
suma końcowa
Kolumny na liście ROLLUP są takie same jak w przykładzie B, lecz są one w przeciwnej kolejności.Kolumny są rzutowane od prawej do lewej; kolejność wpływa zatem na grupowanie.Liczba wierszy w zestawie wyników może być zróżnicowana w zależności od porządku kolumn.
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];
Oto zestaw wyników.
Region |
Country |
Sklep |
ID_sprzedawcy |
Łączna sprzedaż |
---|---|---|---|---|
NULL |
NULL |
NULL |
NULL |
297597.8 |
NULL |
NULL |
NULL |
284 |
33633.59 |
NULL |
NULL |
Dostawcy SPA i ćwiczeń |
284 |
32774.36 |
NULL |
FR |
Dostawcy SPA i ćwiczeń |
284 |
32774.36 |
Europa |
FR |
Dostawcy SPA i ćwiczeń |
284 |
32774.36 |
NULL |
NULL |
Wszechstronna firma towarów sportowych |
284 |
859.232 |
NULL |
DE |
Wszechstronna firma towarów sportowych |
284 |
859.232 |
Europa |
DE |
Wszechstronna firma towarów sportowych |
284 |
859.232 |
NULL |
NULL |
NULL |
286 |
246272.4 |
NULL |
NULL |
Dostawcy SPA i ćwiczeń |
286 |
246272.4 |
NULL |
FR |
Dostawcy SPA i ćwiczeń |
286 |
246272.4 |
Europa |
FR |
Dostawcy SPA i ćwiczeń |
286 |
246272.4 |
NULL |
NULL |
NULL |
289 |
17691.83 |
NULL |
NULL |
Wszechstronna firma towarów sportowych |
289 |
17691.83 |
NULL |
DE |
Wszechstronna firma towarów sportowych |
289 |
17691.83 |
Europa |
DE |
Wszechstronna firma towarów sportowych |
289 |
17691.83 |
D.Używanie operatora GROUP BY z połączonymi operacjami ROLLUP
W poniższym przykładzie jest zwracany iloczyn wektorowy dwóch operacji 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);
Oto zestaw wyników.
Region |
Country |
Rok |
Miesiąc |
Łączna sprzedaż |
---|---|---|---|---|
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.Użycie operatora GROUP BY CUBE
W poniższym przykładzie operator CUBE zwraca zestaw wyników, który ma jedno grupowanie dla wszystkich możliwych kombinacji kolumn na liście CUBE i sumę całkowitą grupowania.
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;
Oto zestaw wyników.
Region |
Country |
Sklep |
ID_sprzedawcy |
Łączna sprzedaż |
---|---|---|---|---|
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 |
Dostawcy SPA i ćwiczeń |
NULL |
236210.9015 |
NULL |
NULL |
Dostawcy SPA i ćwiczeń |
287 |
27731.551 |
NULL |
NULL |
Dostawcy SPA i ćwiczeń |
290 |
208479.3505 |
NULL |
NULL |
Wszechstronna firma towarów sportowych |
NULL |
17802.6999 |
NULL |
NULL |
Wszechstronna firma towarów sportowych |
287 |
729.6344 |
NULL |
NULL |
Wszechstronna firma towarów sportowych |
288 |
17073.0655 |
NULL |
DE |
NULL |
NULL |
17802.6999 |
NULL |
DE |
NULL |
287 |
729.6344 |
NULL |
DE |
NULL |
288 |
17073.0655 |
NULL |
DE |
Wszechstronna firma towarów sportowych |
NULL |
17802.6999 |
NULL |
DE |
Wszechstronna firma towarów sportowych |
287 |
729.6344 |
NULL |
DE |
Wszechstronna firma towarów sportowych |
288 |
17073.0655 |
NULL |
FR |
NULL |
NULL |
236210.9015 |
NULL |
FR |
NULL |
287 |
27731.551 |
NULL |
FR |
NULL |
290 |
208479.3505 |
NULL |
FR |
Dostawcy SPA i ćwiczeń |
NULL |
236210.9015 |
NULL |
FR |
Dostawcy SPA i ćwiczeń |
287 |
27731.551 |
NULL |
FR |
Dostawcy SPA i ćwiczeń |
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 |
Dostawcy SPA i ćwiczeń |
NULL |
236210.9015 |
Europa |
NULL |
Dostawcy SPA i ćwiczeń |
287 |
27731.551 |
Europa |
NULL |
Dostawcy SPA i ćwiczeń |
290 |
208479.3505 |
Europa |
NULL |
Wszechstronna firma towarów sportowych |
NULL |
17802.6999 |
Europa |
NULL |
Wszechstronna firma towarów sportowych |
287 |
729.6344 |
Europa |
NULL |
Wszechstronna firma towarów sportowych |
288 |
17073.0655 |
Europa |
DE |
NULL |
NULL |
17802.6999 |
Europa |
DE |
NULL |
287 |
729.6344 |
Europa |
DE |
NULL |
288 |
17073.0655 |
Europa |
DE |
Wszechstronna firma towarów sportowych |
NULL |
17802.6999 |
Europa |
DE |
Wszechstronna firma towarów sportowych |
287 |
729.6344 |
Europa |
DE |
Wszechstronna firma towarów sportowych |
288 |
17073.0655 |
Europa |
FR |
NULL |
NULL |
236210.9015 |
Europa |
FR |
NULL |
287 |
27731.551 |
Europa |
FR |
NULL |
290 |
208479.3505 |
Europa |
FR |
Dostawcy SPA i ćwiczeń |
NULL |
236210.9015 |
Europa |
FR |
Dostawcy SPA i ćwiczeń |
287 |
27731.551 |
Europa |
FR |
Dostawcy SPA i ćwiczeń |
290 |
208479.3505 |
F.Używanie operatora CUBE z elementami złożonymi
W poniższym przykładzie operator CUBE zwraca zestaw wyników, który ma jedno grupowanie dla wszystkich możliwych kombinacji kolumn na liście CUBE i sumę całkowitą grupowania.
Operator przetwarza zgrupowane kolumny (T.[Group], T.CountryRegionCode) i (DATEPART(yyyy,OrderDate), DATEPART(mm,OrderDate)) jako pojedyncze kolumny.
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);
Oto zestaw wyników.
Region |
Country |
Rok |
Miesiąc |
Łączna sprzedaż |
---|---|---|---|---|
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.Użycie operatorów GROUP BY z GROUPING SETS
W poniższym przykładzie operator GROUPING SETS posiada cztery grupowania, jedno dla każdej kolumny na liście SELECT.Operator zwraca jeden wiersz dla każdej wartości unikatowej w kolumnach Region, Country, Store, i 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;
Oto zestaw wyników.
Region |
Country |
Sklep |
ID_sprzedawcy |
Łączna sprzedaż |
---|---|---|---|---|
NULL |
NULL |
NULL |
287 |
28461.1854 |
NULL |
NULL |
NULL |
288 |
17073.0655 |
NULL |
NULL |
NULL |
290 |
208479.3505 |
NULL |
NULL |
Dostawcy SPA i ćwiczeń |
NULL |
236210.9015 |
NULL |
NULL |
Wszechstronna firma towarów sportowych |
NULL |
17802.6999 |
NULL |
DE |
NULL |
NULL |
17802.6999 |
NULL |
FR |
NULL |
NULL |
236210.9015 |
Europa |
NULL |
NULL |
NULL |
254013.6014 |
H.Używanie operacji GROUPING SETS z elementami złożonymi
W poniższym przykładzie lista GROUPING SETS zawiera dwa elementy złożone, (T.[Group], T.CountryRegionCode) i (DATEPART(yyyy,OrderDate), DATEPART(mm,OrderDate)).Każdy element złożony jest traktowany jako jedna kolumna.
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);
Oto zestaw wyników.
Region |
Country |
Rok |
Miesiąc |
Łączna sprzedaż |
---|---|---|---|---|
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 |
G.Użycie operatorów GROUP BY z wieloma GROUPING SETS
W poniższym przykładzie lista GROUPING SETS ma pięć elementów.Zestaw wyników zawiera jeden wiersz dla następujących elementów:
Każda unikatowa kombinacja wartości w kolumnach Region i Country
Każda unikatowa wartość w kolumnie Store
Każda unikatowa kombinacja wartości w kolumnach SalesPersonID i Region
Każda unikatowa wartość w kolumnie SalesPersonID
Suma końcowa
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;
Oto zestaw wyników.
Region |
Country |
Sklep |
ID_sprzedawcy |
Łączna sprzedaż |
---|---|---|---|---|
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 |
Dostawcy SPA i ćwiczeń |
NULL |
236210.9015 |
NULL |
NULL |
Wszechstronna firma towarów sportowych |
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.Użycie GROUPING SETS z operatorem ROLLUP części listy GROUP BY
W poniższym przykładzie lista GROUPING SETS obejmuje grupowania dla kolumn T.[Group] i T.CountryRegionCode i ROLLUP z kolumn S.Name i 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;
Oto zestaw wyników.
Region |
Country |
Sklep |
ID_sprzedawcy |
Łączna sprzedaż |
---|---|---|---|---|
NULL |
NULL |
NULL |
NULL |
254013.6014 |
NULL |
NULL |
Dostawcy SPA i ćwiczeń |
NULL |
236210.9015 |
NULL |
NULL |
Dostawcy SPA i ćwiczeń |
287 |
27731.551 |
NULL |
NULL |
Dostawcy SPA i ćwiczeń |
290 |
208479.3505 |
NULL |
NULL |
Wszechstronna firma towarów sportowych |
NULL |
17802.6999 |
NULL |
NULL |
Wszechstronna firma towarów sportowych |
287 |
729.6344 |
NULL |
NULL |
Wszechstronna firma towarów sportowych |
288 |
17073.0655 |
NULL |
DE |
NULL |
NULL |
17802.6999 |
NULL |
FR |
NULL |
NULL |
236210.9015 |
Europa |
NULL |
NULL |
NULL |
254013.6014 |
K.Użycie GROUPING SETS z operatorem CUBE części listy GROUP BY
W poniższym przykładzie lista GROUPING SETS obejmuje grupowania dla kolumn T.[Group] i T.CountryRegionCode i CUBE z kolumn S.Name i 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;
Oto zestaw wyników.
Region |
Country |
Sklep |
ID_sprzedawcy |
Łączna sprzedaż |
---|---|---|---|---|
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 |
Dostawcy SPA i ćwiczeń |
NULL |
236210.9015 |
NULL |
NULL |
Dostawcy SPA i ćwiczeń |
287 |
27731.551 |
NULL |
NULL |
Dostawcy SPA i ćwiczeń |
290 |
208479.3505 |
NULL |
NULL |
Wszechstronna firma towarów sportowych |
NULL |
17802.6999 |
NULL |
NULL |
Wszechstronna firma towarów sportowych |
287 |
729.6344 |
NULL |
NULL |
Wszechstronna firma towarów sportowych |
288 |
17073.0655 |
NULL |
DE |
NULL |
NULL |
17802.6999 |
NULL |
FR |
NULL |
NULL |
236210.9015 |
Europa |
NULL |
NULL |
NULL |
254013.6014 |