Datenbanken und mehr

11. Dezember 2007

Neu in Katmaii – GROUPING SETS

Filed under: Katmai, T-SQL — Urs Gehrig @ 08:54

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

  1. GROUP BY CustomerID, SalesPersonID, YEAR(OrderDate), MONTH(OrderDate)
  2. GROUP BY CustomerID, SalesPersonID, YEAR(OrderDate)
  3. GROUP BY CustomerID, YEAR(OrderDate), MONTH(OrderDate)
  4. GROUP BY CustomerID, YEAR(OrderDate)
  5. GROUP BY SalesPersonID, YEAR(OrderDate), MONTH(OrderDate)
  6. 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
Advertisements

1 Kommentar »

  1. pass it on

    Kommentar von math games for kids — 4. Januar 2011 @ 05:34


RSS feed for comments on this post. TrackBack URI

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

Bloggen auf WordPress.com.

%d Bloggern gefällt das: