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 の使用

 

ROLLUP の使用

多くのアプリケーションに共通の要件は、グループ化属性の小計を左から右へ順番に計算することです。このパターンは、階層として参照されます。小計の計算が追加されることにより、詳細度を上げた追加のローが生成されるためです。SQL Anywhere では、ROLLUP キーワードを使用して ROLLUP 句を指定することにより、グループ化属性の階層を指定できます。

ROLLUP 句を使用したクエリでは、次のようなグループ化セットの階層が生成されます。ROLLUP 句に (X1,X2, . . . , Xn) という形式で n 個の GROUP BY 式が含まれる場合、ROLLUP 句によって次のように n + 1 個のグループ化セットが生成されます。

{(), (X1), (X1,X2), (X1,X2,X3), ... , (X1,X2,X3, ... , 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 ROLLUP( Year, Quarter )
ORDER BY Year, Quarter;

このクエリは、次の結果を返します。

Quarter Year Orders GQ GY
1 (NULL) (NULL) 648 1 1
2 (NULL) 2000 380 1 0
3 1 2000 87 0 0
4 2 2000 77 0 0
5 3 2000 91 0 0
6 4 2000 125 0 0
7 (NULL) 2001 268 1 0
8 1 2001 139 0 0
9 2 2001 119 0 0
10 3 2001 10 0 0

結果セットの 1 番目のローは、2 年間のすべての四半期について、すべての注文の総合計 (648) を示します。

ロー 2 は 2000 年の注文の合計数 (380) を示し、ロー 3 ~ 6 はこの年の四半期ごとの注文の小計を示します。同様に、ロー 7 は 2001 年の注文の合計数 (268) を示し、ロー 8 ~ 10 はこの年の四半期ごとの小計を示します。

GROUPING 関数で返される値を使用して、総合計が含まれるローと小計のローを区別できます。ロー 2 と 7 では、四半期カラムは NULL で、GQ (Grouping by Quarter) カラムは値 1 です。これは、このローが年ごとのすべての四半期の注文の合計であることを示します。

同様に、ロー 1 の四半期 (Quarter) カラムと年 (Year ) カラムは NULL で、GQ カラムと GY カラムは値 1 です。これは、このローがすべての年のすべての四半期における注文の合計であることを示します。

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

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

代わりに Transact-SQL 互換の構文である WITH ROLLUP を使用して、GROUP BY ROLLUP と同じ結果を得ることもできます。ただし、構文が多少異なり、構文に指定できるのは単純な GROUP BY 式リストだけです。

次のクエリは、前述の GROUP BY ROLLUP の例の場合と同等の結果を生成します。

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 ROLLUP
ORDER BY Year, Quarter;