ROLLUP 句で提供される階層グループ化パターンの代わりに、データキューブを作成することもできます。データキューブとは、GROUP BY 式の可能な組み合わせを使用した入力の n 次元要約で、CUBE 句が使用されます。CUBE 句の結果は、各値セットの要素のすべての可能な組み合わせを含む積集合になります。複雑なデータ分析で非常に役立ちます。
CUBE 句に (X1,X2, . . .,Xn) という形式で n 個の GROUPING 式が存在する場合、CUBE によって次のように 2n 個のグループ化セットが生成されます。
{(), (X1), (X1,X2), (X1,X2,X3), ... , (X1,X2,X3, ...,Xn), (X2), (X2,X3), (X2,X3,X4), ... , (X2,X3,X4, ... , Xn), ... , (Xn)}. |
次のクエリは、年ごと、四半期ごと、および四半期単位に販売注文を要約し、次の表に示す結果セットを生成します。
SELECT QUARTER( OrderDate ) AS Quarter, YEAR( OrderDate ) AS Year, COUNT( * ) AS Orders, GROUPING( Quarter ) AS GQ, GROUPING( Year ) AS GY FROM SalesOrders GROUP BY CUBE ( Year, Quarter ) ORDER BY Year, Quarter; |
このクエリは、次の結果を返します。
Quarter | Year | Orders | GQ | GY | |
---|---|---|---|---|---|
1 | (NULL) | (NULL) | 648 | 1 | 1 |
2 | 1 | (NULL) | 226 | 0 | 1 |
3 | 2 | (NULL) | 196 | 0 | 1 |
4 | 3 | (NULL) | 101 | 0 | 1 |
5 | 4 | (NULL) | 125 | 0 | 1 |
6 | (NULL) | 2000 | 380 | 1 | 0 |
7 | 1 | 2000 | 87 | 0 | 0 |
8 | 2 | 2000 | 77 | 0 | 0 |
9 | 3 | 2000 | 91 | 0 | 0 |
10 | 4 | 2000 | 125 | 0 | 0 |
11 | (NULL) | 2001 | 268 | 1 | 0 |
12 | 1 | 2001 | 139 | 0 | 0 |
13 | 2 | 2001 | 119 | 0 | 0 |
14 | 3 | 2000 | 10 | 0 | 0 |
結果セットの 1 番目のローは、2000 年と 2001 年を結合した、すべての四半期についての、すべての注文の総合計 (648) を示します。
ロー 2 ~ 5 は、すべての年の暦四半期ごとの販売注文を要約します。
ロー 6 と 11 の Orders は、それぞれ 2000 年と 2001 年の注文の合計を示します。
ロー 7 ~ 10 と 12 ~ 14 は、それぞれ 2000 年と 2001 年の四半期ごとの合計を示します。
GROUPING 関数で返される値を使用して、総合計が含まれるローと小計のローを区別できます。ロー 6 と 11 は、四半期 (Quarter) カラムは NULL で、GQ (Grouping by Quarter) カラムは値 1 です。これは、このローが年ごとにすべての四半期の注文 (Orders) の合計であることを示します。
CUBE は指数関数的な個数のグループ化セットを生成するため、CUBE を使用して生成される結果セットは非常に大きくなることがあります。このため、64 個を超える GROUP BY 式が含まれる GROUP BY 句はサポートされていません。この上限を超える文は、SQLCODE -944 (SQLSTATE 42WA1) で失敗します。
代わりに Transact-SQL 互換の構文である WITH CUBE を使用して、GROUP BY CUBE と同じ結果を得ることもできます。ただし、構文が多少異なり、構文に指定できるのは単純な GROUP BY 式リストだけです。
次のクエリは、前述の GROUP BY CUBE の例の場合と同等の結果を生成します。
SELECT QUARTER( OrderDate ) AS Quarter, YEAR( OrderDate ) AS Year, COUNT( * ) AS Orders, GROUPING( Quarter ) AS GQ, GROUPING( Year ) AS GY FROM SalesOrders GROUP BY Year, Quarter WITH CUBE ORDER BY Year, Quarter; |
![]() |
DocCommentXchange で意見交換できます
|
Copyright © 2013, SAP AG or an SAP affiliate company. - SAP Sybase SQL Anywhere 16.0 |