Zusammenfassen von Daten mit CUBE

Der CUBE-Operator generiert als Resultset einen multidimensionalen Cube. Bei einem multidimensionalen Cube handelt es sich um eine Erweiterung von Faktendaten oder Daten, die einzelne Ereignisse aufzeichnen. Die Erweiterung basiert auf Spalten, die der Benutzer analysieren möchte. Diese Spalten werden als Dimensionen bezeichnet. Der Cube ist ein Resultset, das ein Kreuzprodukt als Tabellarisierung aller möglichen Kombinationen der Dimensionen enthält.

Der CUBE-Operator wird in der GROUP BY-Klausel einer SELECT-Anweisung angegeben. Die Auswahlliste enthält die Dimensionsspalten und Aggregatfunktionsausdrücke. Die GROUP BY-Klausel gibt die Dimensionsspalten und die WITH CUBE-Schlüsselwörter an. Das Resultset enthält alle möglichen Kombinationen der Werte in den Dimensionsspalten zusammen mit den Aggregatwerten der zugrunde liegenden Zeilen, die mit der jeweiligen Kombination aus Dimensionswerten übereinstimmen.

So enthält eine einfache Inventory-Tabelle z. B. Folgendes:

Item                 Color                Quantity                   
-------------------- -------------------- -------------------------- 
Table                Blue                 124                        
Table                Red                  223                        
Chair                Blue                 101                        
Chair                Red                  210                        

Die folgende Abfrage gibt ein Resultset zurück, das die Quantity-Teilergebnisse für alle möglichen Kombinationen aus Item und Color enthält:

SELECT Item, Color, SUM(Quantity) AS QtySum
FROM Inventory
GROUP BY Item, Color WITH CUBE

Dies ist das Resultset. 

Item                 Color                QtySum                     
-------------------- -------------------- -------------------------- 
Chair                Blue                 101.00                     
Chair                Red                  210.00                     
Chair                (null)               311.00                     
Table                Blue                 124.00                     
Table                Red                  223.00                     
Table                (null)               347.00                     
(null)               (null)               658.00                     
(null)               Blue                 225.00                     
(null)               Red                  433.00                     

Die folgenden Zeilen aus dem Resultset sind von besonderem Interesse:

Chair                (null)               311.00                     

Diese Zeile berichtet ein Teilergebnis für alle Zeilen, die den Wert Chair in der Item-Dimension aufweisen. Für die Color-Dimension wird null zurückgegeben, um anzuzeigen, dass Aggregate, die von der Zeile berichtet werden, Zeilen mit beliebigen Werten in der Color-Dimension umfassen.

Table                (null)               347.00                     

Diese Zeile ist vergleichbar, berichtet jedoch das Teilergebnis für alle Zeilen, die den Wert Table in der Item-Dimension aufweisen.

(null)               (null)               658.00                     

Diese Zeile berichtet das Gesamtergebnis für den Cube. Sowohl die Item- als auch die Color-Dimension weisen den Wert null auf. Dies zeigt, dass alle Werte der beiden Dimensionen in der Zeile zusammengefasst sind.

(null)               Blue                 225.00                     
(null)               Red                  433.00                     

Diese zwei Zeilen berichten die Teilergebnisse für die Color-Dimension. Beide weisen null in der Item-Dimension auf, um anzuzeigen, dass die Aggregatdaten aus Zeilen stammen, die beliebige Werte in der Item-Dimension enthalten.

Verwenden von GROUPING zur Unterscheidung von NULL-Werten

Die von der CUBE-Operation generierten NULL-Werte bringen ein Problem mit sich: Wie kann ein von der CUBE-Operation generierter NULL-Wert von einem NULL-Wert, der in den tatsächlichen Daten zurückgegeben wird, unterschieden werden? Dieses Problem wird mithilfe der GROUPING-Funktion behoben. Die GROUPING-Funktion gibt 0 zurück, wenn der Spaltenwert aus den Faktendaten stammt; sie gibt 1 zurück, wenn der Spaltenwert ein NULL-Wert ist, der von der CUBE-Operation generiert wurde. In einer CUBE-Operation stellt ein generierter NULL-Wert alle Werte dar. Die SELECT-Anweisung kann so geschrieben werden, dass die GROUPING-Funktion alle generierten NULL-Werte durch die ALL-Zeichenfolge ersetzt. Da ein NULL-Wert aus den Faktendaten anzeigt, dass der Datenwert unbekannt ist, kann die SELECT-Anweisung auch so codiert werden, dass die UNKNOWN-Zeichenfolge statt eines NULL-Wertes aus den Faktendaten zurückgegeben wird. Beispiel:

SELECT CASE WHEN (GROUPING(Item) = 1) THEN 'ALL'
            ELSE ISNULL(Item, 'UNKNOWN')
       END AS Item,
       CASE WHEN (GROUPING(Color) = 1) THEN 'ALL'
            ELSE ISNULL(Color, 'UNKNOWN')
       END AS Color,
       SUM(Quantity) AS QtySum
FROM Inventory
GROUP BY Item, Color WITH CUBE

Multidimensionale Cubes

Der CUBE-Operator kann zum Generieren von n-dimensionalen Cubes oder Cubes mit einer beliebigen Anzahl an Dimensionen verwendet werden. Ein eindimensionaler Cube kann wie im folgenden Beispiel zum Generieren eines Gesamtwertes verwendet werden:

SELECT CASE WHEN (GROUPING(Item) = 1) THEN 'ALL'
            ELSE ISNULL(Item, 'UNKNOWN')
       END AS Item,
       SUM(Quantity) AS QtySum
FROM Inventory
GROUP BY Item WITH CUBE
GO

Diese SELECT-Anweisung gibt ein Resultset zurück, das sowohl die Teilergebnisse für jeden Wert von Item als auch das Gesamtergebnis für alle Werte von Item zurückgibt:

Item                 QtySum                     
-------------------- -------------------------- 
Chair                311.00                     
Table                347.00                     
ALL                  658.00                     

SELECT-Anweisungen, die einen CUBE-Operator mit mehreren Dimensionen enthalten, können umfangreiche Resultsets generieren, da diese Anweisungen Zeilen für alle Kombinationen der Werte in allen Dimensionen generieren. Diese umfangreichen Resultsets enthalten möglicherweise zu viele Daten, um noch einfach gelesen oder verstanden werden zu können. Eine Lösung für dieses Problem besteht darin, die SELECT-Anweisung in eine Sicht zu übertragen:

CREATE VIEW InvCube AS
SELECT CASE WHEN (GROUPING(Item) = 1) THEN 'ALL'
            ELSE ISNULL(Item, 'UNKNOWN')
       END AS Item,
       CASE WHEN (GROUPING(Color) = 1) THEN 'ALL'
            ELSE ISNULL(Color, 'UNKNOWN')
       END AS Color,
       SUM(Quantity) AS QtySum
FROM Inventory
GROUP BY Item, Color WITH CUBE

Die Sicht kann dann verwendet werden, um ausschließlich die gewünschten Dimensionswerte abzufragen:

SELECT *
FROM InvCube
WHERE Item = 'Chair'
  AND Color = 'ALL'

Item                 Color                QtySum                     
-------------------- -------------------- -------------------------- 
Chair                ALL                  311.00                     

(1 row(s) affected)

Siehe auch

Konzepte

Zusammenfassen von Daten mit ROLLUP

Andere Ressourcen

SELECT (Transact-SQL)

Hilfe und Informationen

Informationsquellen für SQL Server 2005