Hast du schon mal probiert, mit SQL Server 2005 in ein und demselben Query mehrere GROUP BY Kriterien miteinander zu verbinden? Mit CUBE und ROLLUP kommst du bestimmt schon weit, mit der in Katmaii neuen GROUPING SETS Klausel sind dir nun aber praktisch keine Grenzen mehr gesetzt. Warum die ganzen Kriterien in bloss einem SQL Statement und nicht mit mehren, welche du mit UNION zusammen fügst? Naja, geht bestimmt, aber wir wollen ja ein effizientes Query. Nun aber zu GROUPING SETS. Fangen wir mit einem Beispiel an:
USE AdventureWorks;
GO
SELECT CustomerID
, SalesPersonID
, YEAR(OrderDate) AS OrderYear
, MONTH(OrderDate) AS OrderMonth
, SUM(SubTotal) AS Total
FROM Sales.SalesOrderHeader
WHERE CustomerID < 10
GROUP BY
GROUPING SETS
(
(CustomerID, SalesPersonID),
(CustomerID),
(SalesPersonID)
),
GROUPING SETS
(
(YEAR(OrderDate), MONTH(OrderDate)),
(YEAR(OrderDate))
)
ORDER BY CustomerID, SalesPersonID, OrderYear, OrderMonth
Was macht dieses Query? Nichts anderes als insgesamt sechs verschiedene GROUP BY’s. Nämlich
- GROUP BY CustomerID, SalesPersonID, YEAR(OrderDate), MONTH(OrderDate)
- GROUP BY CustomerID, SalesPersonID, YEAR(OrderDate)
- GROUP BY CustomerID, YEAR(OrderDate), MONTH(OrderDate)
- GROUP BY CustomerID, YEAR(OrderDate)
- GROUP BY SalesPersonID, YEAR(OrderDate), MONTH(OrderDate)
- GROUP BY SalesPersonID, YEAR(OrderDate)
Kommt in einer GROUB BY Klausel ein einzelnes Feld nicht vor, erhält das Resultat an der entsprechenden Stelle den Wert NULL. Das Ergebnis aus dem obigen Query sieht in etwa wie folgt aus; damit denke ich, dass du die Funktionsweise von GROUPING SETS nun verstehst, auch ohne dass ich hierzu noch mehr Worte verliere:
| CustomerID |
SalesPersonID |
OrderYear |
OrderMonth |
Total |
| NULL |
268 |
2002 |
7 |
3569.4338 |
| NULL |
275 |
2003 |
1 |
97037.566 |
| NULL |
275 |
2003 |
4 |
94133.8413 |
| NULL |
275 |
2003 |
7 |
73368.0931 |
| NULL |
275 |
2003 |
10 |
73455.3404 |
| NULL |
275 |
2004 |
NULL |
176878.6938 |
| NULL |
275 |
2004 |
3 |
15431.5196 |
| NULL |
275 |
2004 |
6 |
31559.7518 |
| NULL |
276 |
2002 |
10 |
2449.6033 |
| NULL |
276 |
2003 |
1 |
1769.1174 |
| NULL |
276 |
2003 |
9 |
59.9326 |
| NULL |
276 |
2004 |
NULL |
2696.2418 |
| NULL |
276 |
2004 |
6 |
2137.231 |
| NULL |
277 |
2001 |
9 |
18555.8149 |
| NULL |
277 |
2002 |
NULL |
390424.4465 |
| NULL |
277 |
2002 |
6 |
11796.1804 |
| NULL |
277 |
2002 |
9 |
71112.1316 |
| NULL |
277 |
2002 |
12 |
51198.5404 |
| NULL |
279 |
2002 |
11 |
290.1614 |
| NULL |
279 |
2003 |
2 |
4903.775 |
| NULL |
279 |
2003 |
8 |
10309.0561 |
| NULL |
279 |
2004 |
NULL |
14645.1583 |
| NULL |
279 |
2004 |
5 |
8441.6436 |
| NULL |
280 |
2001 |
8 |
13216.0537 |
| NULL |
280 |
2002 |
NULL |
65489.709 |
| NULL |
280 |
2002 |
5 |
31423.5209 |
| NULL |
281 |
2002 |
9 |
20720.6175 |
| NULL |
281 |
2003 |
NULL |
54485.9727 |
| NULL |
281 |
2003 |
6 |
9134.6608 |
| NULL |
281 |
2003 |
12 |
18431.5666 |
| NULL |
281 |
2004 |
3 |
7950.2303 |
| NULL |
283 |
2002 |
NULL |
14166.2185 |
| NULL |
283 |
2002 |
11 |
4949.8589 |
| NULL |
283 |
2003 |
2 |
1574.1247 |
| NULL |
283 |
2003 |
8 |
3534.1671 |
| NULL |
283 |
2004 |
NULL |
4490.7426 |
| NULL |
283 |
2004 |
5 |
822.009 |
| 1 |
NULL |
2001 |
8 |
13216.0537 |
| 1 |
NULL |
2002 |
NULL |
65489.709 |
| 1 |
NULL |
2002 |
5 |
31423.5209 |
| 1 |
280 |
2001 |
8 |
13216.0537 |
| 1 |
280 |
2002 |
NULL |
65489.709 |
| 1 |
280 |
2002 |
5 |
31423.5209 |
| 2 |
NULL |
2002 |
8 |
9216.3596 |
| 2 |
NULL |
2003 |
NULL |
10966.5406 |
| 2 |
NULL |
2003 |
5 |
1751.5987 |
| 2 |
NULL |
2003 |
11 |
4106.6501 |
| 2 |
NULL |
2004 |
2 |
3668.7336 |
| 2 |
283 |
2002 |
NULL |
14166.2185 |
| 2 |
283 |
2002 |
11 |
4949.8589 |
| 2 |
283 |
2003 |
2 |
1574.1247 |
| 2 |
283 |
2003 |
8 |
3534.1671 |
| 2 |
283 |
2004 |
NULL |
4490.7426 |
| 2 |
283 |
2004 |
5 |
822.009 |
| 3 |
NULL |
2001 |
9 |
18555.8149 |
| 3 |
NULL |
2002 |
NULL |
152392.4906 |
| 3 |
NULL |
2002 |
6 |
11796.1804 |
| 3 |
NULL |
2002 |
12 |
51198.5404 |
| 3 |
NULL |
2003 |
3 |
27899.9579 |
| 3 |
NULL |
2003 |
9 |
83436.1754 |
| 3 |
NULL |
2004 |
NULL |
46991.2714 |
| 3 |
NULL |
2004 |
6 |
31559.7518 |
| 3 |
275 |
2003 |
3 |
27899.9579 |
| 3 |
275 |
2003 |
9 |
83436.1754 |
| 3 |
275 |
2004 |
NULL |
46991.2714 |
| 3 |
275 |
2004 |
6 |
31559.7518 |
| 3 |
277 |
2001 |
9 |
18555.8149 |
| 3 |
277 |
2002 |
NULL |
152392.4906 |
| 3 |
277 |
2002 |
6 |
11796.1804 |
| 3 |
277 |
2002 |
12 |
51198.5404 |
| 4 |
NULL |
2002 |
7 |
118394.1258 |
| 4 |
NULL |
2003 |
NULL |
337994.8408 |
| 4 |
NULL |
2003 |
4 |
94133.8413 |
| 4 |
NULL |
2003 |
10 |
73455.3404 |
| 4 |
NULL |
2004 |
1 |
67414.7924 |
| 4 |
275 |
2003 |
NULL |
337994.8408 |
| 4 |
275 |
2003 |
4 |
94133.8413 |
| 4 |
275 |
2003 |
10 |
73455.3404 |
| 4 |
275 |
2004 |
1 |
67414.7924 |
| 4 |
277 |
2002 |
NULL |
238031.9559 |
| 4 |
277 |
2002 |
10 |
119637.8301 |
| 5 |
NULL |
2002 |
9 |
20720.6175 |
| 5 |
NULL |
2003 |
NULL |
54485.9727 |
| 5 |
NULL |
2003 |
6 |
9134.6608 |
| 5 |
NULL |
2003 |
12 |
18431.5666 |
| 5 |
NULL |
2004 |
3 |
7950.2303 |
| 5 |
281 |
2002 |
NULL |
30199.7195 |
| 5 |
281 |
2002 |
12 |
9479.102 |
| 5 |
281 |
2003 |
3 |
8456.292 |
| 5 |
281 |
2003 |
9 |
18463.4533 |
| 5 |
281 |
2004 |
NULL |
18679.7381 |
| 5 |
281 |
2004 |
6 |
10729.5078 |
| 6 |
NULL |
2003 |
9 |
59.9326 |
| 6 |
NULL |
2004 |
NULL |
2696.2418 |
| 6 |
NULL |
2004 |
6 |
2137.231 |
| 6 |
276 |
2003 |
9 |
59.9326 |
| 6 |
276 |
2004 |
NULL |
2696.2418 |
| 6 |
276 |
2004 |
6 |
2137.231 |
| 7 |
NULL |
2002 |
7 |
3569.4338 |
| 7 |
NULL |
2003 |
NULL |
3365.4121 |
| 7 |
NULL |
2003 |
4 |
1596.2947 |
| 7 |
268 |
2002 |
7 |
3569.4338 |
| 7 |
276 |
2002 |
10 |
2449.6033 |
| 7 |
276 |
2003 |
1 |
1769.1174 |
| 8 |
NULL |
2003 |
NULL |
17592.0783 |
| 8 |
NULL |
2003 |
11 |
8888.6076 |
| 8 |
NULL |
2004 |
2 |
5571.0288 |
| 8 |
279 |
2003 |
NULL |
17592.0783 |
| 8 |
279 |
2003 |
11 |
8888.6076 |
| 8 |
279 |
2004 |
2 |
5571.0288 |
| 9 |
NULL |
2002 |
NULL |
290.1614 |
| 9 |
NULL |
2003 |
NULL |
10318.1878 |
| 9 |
NULL |
2003 |
5 |
586.989 |
| 9 |
NULL |
2003 |
11 |
3221.8384 |
| 9 |
NULL |
2004 |
2 |
632.4859 |
| 9 |
279 |
2002 |
NULL |
290.1614 |
| 9 |
279 |
2003 |
NULL |
10318.1878 |
| 9 |
279 |
2003 |
5 |
586.989 |
| 9 |
279 |
2003 |
11 |
3221.8384 |
| 9 |
279 |
2004 |
2 |
632.4859 |