Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (日本語) » SQL Anywhere サーバ - SQL の使用法 » データのクエリと変更 » OLAP のサポート » GROUPING SETS のショートカットとしての ROLLUP と CUBE の使用

 

CUBE の使用

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 を使用して生成される結果セットは非常に大きくなることがあります。このため SQL Anywhere では、GROUP BY 式が 64 個以上含まれる GROUP BY 句を許可していません。この上限を超える文は、SQLCODE -944 (SQLSTATE 42WA1) で失敗します。

CUBE 句の構文の詳細については、GROUP BY 句を参照してください。

T-SQL WITH CUBE 構文のサポート

代わりに 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;