多くのアプリケーションに共通の要件は、グループ化属性の小計を左から右へ順番に計算することです。このパターンは、階層として参照されます。小計の計算が追加されることにより、詳細度を上げた追加のローが生成されるためです。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 句を参照してください。
代わりに 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; |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |