5.3.2 CUBE und ROLLUP
Aufgrund der beschriebenen Nachteile wurden zunächst als Ergänzung zu
SQL:1999 und dann im Rahmen von SQL:2003 mit dem CUBE- und dem ROLLUP-
Operator Erweiterungen der Gruppierungsklausel aufgenommen, die auch von
den kommerziellen DBMS unterstützt werden.
Der CUBE-Operator geht auf den Vorschlag von Gray et al. [GBLP96,
GCB
+
97] zurück. Im Prinzip handelt es sich um eine „Kurzform“ für Anfra-
gemuster zur Berechnung von Teil- und Gesamtsummen. Hierbei werden aus
einer gegebenen Menge von Gruppierungsattributen alle möglichen Gruppie-
rungskombinationen generiert, über die aggregiert werden kann. Bei der An-
gabe von drei Attributen A
1
, A
2
, und A
3
werden die folgenden Gruppierungen
durchgeführt, wobei die erste Zeile mit () einer Gruppierung über alle Werte
entspricht:
()
(A
1
), (A
2
), (A
3
)
(A
1
, A
2
), (A
1
, A
3
), (A
2
, A
3
)
(A
1
, A
2
, A
3
)
Wie in unserem obigen Beispiel 5-7 werden in den Zwischensummen die
aggregierten Dimensionen durch Nullwerte repräsentiert. Damit wir eine Ver-
wechselung mit Nullwerten vermeiden, werden wir für die Aggregate den Pseu-
dowert ALL im Folgenden nutzen. Demzufolge ist das Gesamtaggregat mit der
Aggregatfunktion f() durch ein Tupel der Form
ALL, ALL, . . . , ALL, f(*)
dargestellt, während höherdimensionale Ebenen weniger dieser Werte aufwei-
sen.
Der CUBE-Operator wird im Rahmen der GROUP BY-Klausel eingesetzt:
SELECT ...
FROM ...
WHERE ...
GROUP BY CUBE(attribut-liste)
JBeispiel 5-8I Die Anfrage aus Beispiel 5-7 kann unter Verwendung des CUBE-
Operators wie folgt notiert werden:
SELECT P
_
Produktgruppe AS PGruppe, YEAR(Z
_
Datum), O
_
Bundesland,
SUM(V
_
Anzahl
*
P
_
Verkaufspreis) AS Umsatz
FROM Verkauf, Zeit, Produkt, Ort
WHERE V
_
Zeit
_
ID = Z
_
ID AND V
_
Produkt
_
ID = P
_
ID AND V
_
Ort
_
ID = O
_
ID
GROUP BY CUBE(P
_
Produktgruppe, YEAR(Z
_
Datum), O
_
Bundesland)
134 5 Anfragen an Data-Warehouse-Datenbanken
Diese Anfrage berechnet zur Eingaberelation Verkauf alle Detaildaten sowie
alle Teil- und Gesamtsummen:
PGruppe Jahr Bundesland Umsatz
Wein 2010 Sachsen-Anhalt 45
Wein 2010 Thüringen 43
Wein 2011 Sachsen-Anhalt 47
Bier 2011 Thüringen 42
CUBE
PGruppe Jahr Bundesland Umsatz
Wein 2010 Sachsen-Anhalt 45
Wein 2010 Thüringen 43
. . . . . . . . . . . .
Wein 2010 ALL 88
Wein 2011 ALL 47
Bier 2011 ALL 42
Wein ALL Sachsen-Anhalt 92
Wein ALL Thüringen 43
Bier ALL Thüringen 42
Wein ALL ALL 135
Bier ALL ALL 42
ALL 2010 Sachsen-Anhalt 45
. . . . . . . . . . . .
ALL ALL Sachsen-Anhalt 92
ALL ALL Thüringen 85
. . . . . . . . . . . .
ALL 2010 ALL 88
ALL 2011 ALL 89
ALL ALL ALL 177
2
Die Anzahl der vom CUBE-Operator erzeugten Gruppen und Aggregate lässt
sich wie folgt angeben:
Bei einer Gruppierung über n Attribute A
1
, A
2
, . . . , A
n
mit den Kardina-
litäten (Anzahl der verschiedenen Attributwerte) C
1
, C
2
, . . . , C
n
berechnet
cube(A
1
, A
2
, . . . , A
n
) eine Relation mit der folgenden Kardinalität:
n
Y
i=1
(C
i
+ 1)
Bei k Attributen in der SELECT-Klausel ergeben sich 2
k
1 Superaggrega-
te in der Ergebnisrelation, d.h. Aggregate, die über andere Aggregate be-
rechnet werden können und somit in unserem Fall Nullwerte in der
Projektionsliste enthalten wie z.B. O
_
Bundesland, ALL.
Für die Anfrage aus Beispiel 5-8 sind dies demnach beispielsweise bei 15 Bun-
desländern, 5 Jahren und 10 Warengruppen 16 · 6 · 11 = 1056 Gruppen und
2
3
1 = 7 Superaggregate.
Falls nicht alle Teilsummen im Ergebnis gewünscht werden, kann die
GROUPING-Funktion in der HAVING-Klausel genutzt werden. Diese Funktion er-
wartet ein Attribut als Parameter und liefert
1, wenn über dieses Attribut aggregiert wurde, und
5.3 SQL-Operationen für das Data Warehouse 135
0, wenn nach diesem Attribut gruppiert wurde.
JBeispiel 5-9I Ein Beispiel ist die Unterdrückung der Gesamtsumme in der
Anfrage aus Beispiel 5-8, indem die folgende HAVING-Klausel eingefügt wird:
...
GROUP BY CUBE(P
_
Produktgruppe, YEAR(Z
_
Datum), O
_
Bundesland)
HAVING NOT (GROUPING(P
_
Produktgruppe) = 1 AND
GROUPING(YEAR(Z
_
Datum)) = 1 AND GROUPING(O
_
Bundesland) = 1)
2
JBeispiel 5-10I Für die Anfrage aus Beispiel 5-8 sollen nur die Gesamt- und
Teilsummen ausgegeben werden, die auch die Produktgruppe enthalten:
...
GROUP BY CUBE(P
_
Produktgruppe, YEAR(Z
_
Datum), O
_
Bundesland)
HAVING GROUPING(P
_
Produktgruppe) = 1
2
Der CUBE-Operator ist ein interdimensionaler Operator, der für Attribute
aus unterschiedlichen Dimensionen anwendbar ist. Dadurch ist er aber auch
für Roll-up- oder Drill-down-Operationen in einer Dimension oft zu aufwendig.
Abhilfe schafft hier der ROLLUP-Operator, der intradimensional wirkt: Zu einer
gegebenen Attributliste A
1
, . . . , A
n
werden die folgenden Attributkombinatio-
nen für Gruppierungen gebildet:
()
(A
1
)
(A
1
, A
2
)
(A
1
, A
2
, . . . , A
n1
)
(A
1
, A
2
, . . . , A
n1
, A
n
)
Das folgende Beispiel zeigt eine einfache Anwendung dieses Operators.
JBeispiel 5-11I Mit der Anfrage soll eine Roll-up-Operation entlang der Ort-
Dimension durchgeführt werden, d.h. die Umsatzzahlen sollen nicht nur pro
Filiale ausgegeben, sondern auch für Ort und Bundesland summiert werden:
SELECT O
_
Bundesland, O
_
Stadt, O
_
Filiale,
SUM(V
_
Anzahl
*
P
_
Verkaufspreis) AS Umsatz
FROM Verkauf, Zeit, Produkt, Ort
WHERE V
_
Zeit
_
ID = Z
_
ID AND V
_
Produkt
_
ID = P
_
ID AND
V
_
Ort
_
ID = O
_
ID AND YEAR(Z
_
Datum) = 2011 AND
P
_
Produktgruppe = ’Wein’
GROUP BY ROLLUP(O
_
Bundesland, O
_
Stadt, O
_
Filiale)
136 5 Anfragen an Data-Warehouse-Datenbanken

Get Data Warehouse Technologien now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.