Die GROUPING SETS-Klausel ist eine Erweiterung zur GROUP BY-Klausel einer SELECT-Anweisung. Die GROUPING SETS-Klausel ermöglicht die Gruppierung der Ergebnisse auf mehrere Arten, ohne mehrere SELECT-Anweisungen benutzen zu müssen. Damit wird die Reaktionszeit verringert und die Performance verbessert.
Die folgenden beiden Abfrageanweisungen sind beispielsweise semantisch gleichwertig: Die zweite Abfrage definiert die Gruppierungskriterien jedoch effizienter, da eine GROUP BY GROUPING SETS-Klausel verwendet wird.
Mehrfachgruppierungen mithilfe von SELECT-Anweisungen:
SELECT NULL, NULL, NULL, COUNT( * ) AS Cnt FROM Customers WHERE State IN ( 'MB' , 'KS' ) UNION ALL SELECT City, State, NULL, COUNT( * ) AS Cnt FROM Customers WHERE State IN ( 'MB' , 'KS' ) GROUP BY City, State UNION ALL SELECT NULL, NULL, CompanyName, COUNT( * ) AS Cnt FROM Customers WHERE State IN ( 'MB' , 'KS' ) GROUP BY CompanyName; |
Mehrfachgruppierungen mithilfe von GROUPING SETS:
SELECT City, State, CompanyName, COUNT( * ) AS Cnt FROM Customers WHERE State IN ( 'MB' , 'KS' ) GROUP BY GROUPING SETS( ( City, State ), ( CompanyName ) , ( ) ); |
Beide Methoden liefern die gleichen Ergebnisse:
City | State | CompanyName | Cnt | |
---|---|---|---|---|
1 | (NULL) | (NULL) | (NULL) | 8 |
2 | (NULL) | (NULL) | Cooper Inc. | 1 |
3 | (NULL) | (NULL) | Westend Dealers | 1 |
4 | (NULL) | (NULL) | Toto's Active Wear | 1 |
5 | (NULL) | (NULL) | North Land Trading | 1 |
6 | (NULL) | (NULL) | The Ultimate | 1 |
7 | (NULL) | (NULL) | Molly's | 1 |
8 | (NULL) | (NULL) | Overland Army Navy | 1 |
9 | (NULL) | (NULL) | Out of Town Sports | 1 |
10 | 'Pembroke' | 'MB' | (NULL) | 4 |
11 | 'Petersburg' | 'KS' | (NULL) | 1 |
12 | 'Drayton' | 'KS' | (NULL) | 3 |
Die Zeilen 2 – 9 sind die Zeilen, die durch die Gruppierung nach "CompanyName" generiert wurden. Die Zeilen 10 – 12 sind die Zeilen, die durch die Gruppierung nach der Kombination von "City" und "State" generiert wurden. Die Zeile 1 ist die Gesamtsumme, die durch die leere Gruppierungskombination repräsentiert wird, welche durch ein Klammernpaar angegeben wird (). Die leere Gruppierungskombination repräsentiert eine einzelne Partition aller Zeilen in der Eingabe für die GROUP BY-Klausel.
Beachten Sie, dass NULL als Platzhalter für alle Ausdrücke verwendet wird, die nicht in einer Gruppierungskombination benutzt werden, da die Ergebnismengen kombinierbar sein müssen. Die Zeilen 2 – 9 ergeben sich beispielsweise aus der zweiten Gruppierungskombination in der Abfrage (CompanyName). Da diese Gruppierungskombination weder "City" noch "State" als Ausdrücke enthielt, enthalten die Werte für "City" und "State" für die Zeilen 2 – 9 den Platzhalter NULL, während die Werte in "CompanyName" die unterschiedlichen Werte enthalten, die in "CompanyName" vorkommen.
Da NULL als Platzhalter benutzt wird, wird dieser leicht mit den tatsächlichen NULL-Werten in den Daten verwechselt. Die GROUPING-Funktion hilft Ihnen bei der Unterscheidung des Platzhalters NULL vom Datenwert NULL. Weitere Hinweise finden Sie unter NULL-Platzhalter mithilfe der GROUPING-Funktion löschen.
Das folgende Beispiel zeigt, wie Sie die von einer Abfrage gelieferten Ergebnisse mithilfe der GROUPING SETS-Klausel anpassen und mithilfe der ORDER BY-Klausel besser organisieren können. Die Abfrage liefert die Gesamtzahl der Bestellungen nach Quartal und die Gesamtzahl für das gesamte Jahr. Durch die Sortierung nach Jahr und Quartal sind die Ergebnisse einfacher zu verstehen:
SELECT Year( OrderDate ) AS Year, Quarter( OrderDate ) AS Quarter, COUNT (*) AS Orders FROM SalesOrders GROUP BY GROUPING SETS ( ( Year, Quarter ), ( Year ) ) ORDER BY Year, Quarter; |
Diese Abfrage liefert folgende Ergebnisse:
Year | Quarter | Orders | |
---|---|---|---|
1 | 2000 | (NULL) | 380 |
2 | 2000 | 1 | 87 |
3 | 2000 | 2 | 77 |
4 | 2000 | 3 | 91 |
5 | 2000 | 4 | 125 |
6 | 2001 | (NULL) | 268 |
7 | 2001 | 1 | 139 |
8 | 2001 | 2 | 119 |
9 | 2001 | 3 | 10 |
Die Zeilen 1 und 6 sind Zwischensummen der Bestellungen für 2000 und 2001. Die Zeilen 2 – 5 und 7 – 9 enthalten die Details für die Zwischensummen. Das heißt, sie enthalten die Bestellungen je Quartal.
In den Ergebnissen gibt es keine Gesamtsumme für alle Quartale aller Jahre. Um auch dieses Ergebnis zu erhalten, muss die Abfrage die leere Gruppierungsspezifikation "()" in der GROUPING SETS-Spezifikation enthalten.
Wenn Sie die leere GROUPING SETS-Spezifikation "()" in der GROUP BY-Klausel benutzen, wird eine Gesamtsummenzeile für alle Elemente zurückgegeben, die in den Ergebnissen zusammengefasst werden. Wenn eine Gesamtsummenzeile vorhanden ist, enthalten die Werte für alle Gruppierungsausdrücke den Platzhalter NULL. Mithilfe der GROUPING-Funktion können Sie den Platzhalter NULL von den tatsächlichen NULL-Werten unterscheiden, die sich aus der Auswertung von Werten in den zugrunde liegenden Daten für die Zeile ergeben. Weitere Hinweise finden Sie unter NULL-Platzhalter mithilfe der GROUPING-Funktion löschen.
In einer GROUPING SETS-Klausel können Sie doppelte Gruppierungsklauseln angeben. In einem solchen Fall enthält das Ergebnis der SELECT-Anweisung identische Zeilen.
Die folgende Abfrage enthält doppelte Gruppierungen:
SELECT City, COUNT( * ) AS Cnt FROM Customers WHERE State IN ( 'MB' , 'KS' ) GROUP BY GROUPING SETS( ( City ), ( City ) ); |
Diese Abfrage liefert folgende Ergebnisse. Beachten Sie, dass die Zeilen 1 – 3 als Ergebnis der doppelten Gruppierungen identisch mit den Zeilen 4 – 6 sind:
City | Cnt | |
---|---|---|
1 | 'Drayton' | 3 |
2 | 'Petersburg' | 1 |
3 | 'Pembroke' | 4 |
4 | 'Drayton' | 3 |
5 | 'Petersburg' | 1 |
6 | 'Pembroke' | 4 |
Die Gruppierungssyntax für eine GROUP BY GROUPING SETS-Klausel wird anders interpretiert als diejenige für eine einfache GROUP BY-Klausel. GROUP BY (X, Y) liefert z.B. Ergebnisse, die nach bestimmten Kombinationen der Werte von X und Y gruppiert sind. GROUP BY GROUPING SETS (X, Y) legt jedoch zwei individuelle Gruppierungskombinationen fest, und das Ergebnis der beiden Gruppierungskombinationen wird mit UNION vereinigt. Das heißt, die Ergebnisse werden nach X gruppiert und dann mit den gleichen Ergebnissen, die nach Y gruppiert sind, vereinigt.
Um ein gutes Format einzuhalten und um Zweideutigkeiten bei komplexen Ausdrücken zu vermeiden, sollten Sie Klammern um jede einzelne Gruppierungskombination in der Spezifikation setzen, wenn die Gefahr von Fehlern besteht. Beispiel: Während die beiden folgenden Anweisungen korrekt und semantisch gleichwertig sind, hat nur die zweite das empfohlene Format.
SELECT * FROM t GROUP BY GROUPING SETS ( X, Y ); SELECT * FROM t GROUP BY GROUPING SETS( ( X ), ( Y ) ); |
Kommentieren Sie diese Seite in DocCommentXchange. Senden Sie uns Feedback über diese Seite via E-Mail. |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |