CUBE拡張は、ROLLUP拡張と同様である。 ROLLUP拡張は、グルーピングを生成し、ROLLUP表現リスト内のアイテムの左から右へのリストに基づく階層をもたらす。 ただし、CUBE拡張は、CUBE式リスト内のすべての項目のすべての順列に基づいて、グループ化と小計を生成します。 したがって、CUBE拡張は、同じ式リストで実行されるROLLUP拡張よりも多くの行を生成された結果セットで返します。
構文
単一のCUBE拡張では、次の構文を使用します。
CUBE ( { expr_1 | ( expr_1a [, expr_1b ] ...) })
[, expr_2 | ( expr_2a [, expr_2b ] ...) ] ...)
- 各 expr は、結果セットのグループ化を決定する式です。 式が (expr_1a、expr_1b、...) のように括弧で囲まれている場合、expr_1aとexpr_1bによって返される値の組み合わせは、単一のグループを定義します。
- 結果セットで返される集計の基本レベルは、式リストによって返される値の一意の組み合わせに対応します。
- リストの最初の項目の一意の値ごとに小計が返されます。 このアイテムは、expr_1または (expr_1a、expr_1b、...) の組み合わせです。 リスト内の2番目のアイテムの一意の値ごとに小計が返されます。 このアイテムは、expr_2または (expr_2a、expr_2b、...) の組み合わせです。 小計も、第1のアイテムと第2のアイテムの一意の組み合わせごとに返される。 第3のアイテムが存在する場合、小計は、第3のアイテムの各一意の値、第3および第1のアイテムの各一意の組み合わせ、第3および第2のアイテムの各一意の組み合わせ、ならびに第3、第2、および第1のアイテムの各一意の組み合わせに対して返される。 最後に、結果セット全体の総計が返されます。
- 小計行の場合、小計がとられる項目に対して null が返されます。
例
次の例は、GROUP BY句内で指定されたCUBE拡張機能を示しています。
SELECT select_list FROM...
GROUP BY [... ,] CUBE ( expression_list ) [, ...]
- select_listで指定された項目は、CUBE expression_listに表示されるか、COUNT、SUM、AVG、MIN、MAXなどの集計関数であるか、またはSYSDATE関数など、戻り値がグループ内の個々の行に依存しない定数または関数である必要があります。
- GROUP BY 句では、複数の CUBE 拡張に加え、複数の他の GROUP BY 拡張および個々の式を指定できます。
- 意味のある構造で出力を表示する場合は、ORDER BY句を使用する必要があります。 ORDER BY句を指定しない場合、結果セットの順序は決定されません。
- グループ化レベルまたは合計の数は、2のN乗である。Nは、CUBE式リスト内のアイテムの数を表す。 括弧で囲まれたリストは、1 つのアイテムとしてカウントされます。
次のクエリは、loc、dname、および job 列の順列に基づいてキューブを生成します。
SELECT loc、dname、job、COUNT(*) AS「従業員」からemp e、dept d
WHERE e.de ptno = d.de ptno
GROUP BY CUBE (loc, dname, job)
順序1、2、3;
次の出力は、クエリの結果を示しています。 システムにより、loc、dname、および job の組み合わせごとに従業員数が計算されます。 システムはまた、locとdnameの各組み合わせ、locとjobの各組み合わせ、dnameとjobの各組み合わせ、locの各一意の値、dnameの各一意の値、およびjobの各一意の値の小計を計算する。 次に、システムは、最終行に表示される総合計を生成する。
loc | dname | 仕事 | 従業員
---------- ---------------------------------------------
BOSTON | OPERATIONS | ANALYST | 1
BOSTON | OPERATIONS | CLERK | 1
BOSTON | OPERATIONS | MANAGER | 1
BOSTON | OPERATIONS | | 3
BOSTON | RESEARCH | ANALYST | 2
BOSTON | RESEARCH | CLERK | 2
BOSTON | RESEARCH | MANAGER | 1
BOSTON | RESEARCH | | 5
BOSTON | | ANALYST | 3
BOSTON | | CLERK | 3
BOSTON | | MANAGER | 2
BOSTON | | | 8
CHICAGO | SALES | CLERK | 1
CHICAGO | SALES | MANAGER | 1
CHICAGO | SALES | SALESMAN | 4
CHICAGO | SALES | | 6
CHICAGO | | CLERK | 1
CHICAGO | | MANAGER | 1
CHICAGO | | SALESMAN | 4
CHICAGO | | | 6
NEW YORK | ACCOUNTING | CLERK | 1
NEW YORK | ACCOUNTING | MANAGER | 1
NEW YORK | ACCOUNTING | PRESIDENT | 1
NEW YORK | ACCOUNTING | | 3
NEW YORK | | CLERK | 1
NEW YORK | | MANAGER | 1
NEW YORK | | PRESIDENT | 1
NEW YORK | | | 3
| ACCOUNTING | CLERK | 1
| ACCOUNTING | MANAGER | 1
| ACCOUNTING | PRESIDENT | 1
| ACCOUNTING | | 3
| OPERATIONS | ANALYST | 1
| OPERATIONS | CLERK | 1
| OPERATIONS | MANAGER | 1
| OPERATIONS | | 3
| RESEARCH | ANALYST | 2
| RESEARCH | CLERK | 2
| RESEARCH | MANAGER | 1
| RESEARCH | | 5
| SALES | CLERK | 1
| SALES | MANAGER | 1
| SALES | SALESMAN | 4
| SALES | | 6
| | ANALYST | 3
| | CLERK | 5
| | MANAGER | 4
| | PRESIDENT | 1
| | SALESMAN | 4
| | | 17
(50行)
次のクエリは、CUBE リスト内の項目を括弧内で組み合わせる方法を示しています。
SELECT loc、dname、job、COUNT(*) AS「従業員」からemp e、dept d
WHERE e.de ptno = d.de ptno
GROUP BY CUBE (loc, (dname, job))
順序1、2、3;
次の出力は、locとdnameの組み合わせ、およびlocとjobの組み合わせを含む順列、またはdnameまたはjobに対して小計が生成されないことを示しています。
loc | dname | 仕事 | 従業員
---------- ---------------------------------------------
BOSTON | OPERATIONS | ANALYST | 1
BOSTON | OPERATIONS | CLERK | 1
BOSTON | OPERATIONS | MANAGER | 1
BOSTON | RESEARCH | ANALYST | 2
BOSTON | RESEARCH | CLERK | 2
BOSTON | RESEARCH | MANAGER | 1
BOSTON | | | 8
CHICAGO | SALES | CLERK | 1
CHICAGO | SALES | MANAGER | 1
CHICAGO | SALES | SALESMAN | 4
CHICAGO | | | 6
NEW YORK | ACCOUNTING | CLERK | 1
NEW YORK | ACCOUNTING | MANAGER | 1
NEW YORK | ACCOUNTING | PRESIDENT | 1
NEW YORK | | | 3
| ACCOUNTING | CLERK | 1
| ACCOUNTING | MANAGER | 1
| ACCOUNTING | PRESIDENT | 1
| OPERATIONS | ANALYST | 1
| OPERATIONS | CLERK | 1
| OPERATIONS | MANAGER | 1
| RESEARCH | ANALYST | 2
| RESEARCH | CLERK | 2
| RESEARCH | MANAGER | 1
| SALES | CLERK | 1
| SALES | MANAGER | 1
| SALES | SALESMAN | 4
| | | 17
(28行)
次のクエリは、最初の式がCUBE拡張の外部で指定される別のバリエーションを示しています。
SELECT loc、dname、job、COUNT(*) AS「従業員」からemp e、dept d
WHERE e.de ptno = d.de ptno
GROUP BY loc, CUBE (dname, job)
順序1、2、3;
次の出力では、locの各グループ内のdnameとjobに対して順列が実行されます。
loc | dname | 仕事 | 従業員
---------- ---------------------------------------------
BOSTON | OPERATIONS | ANALYST | 1
BOSTON | OPERATIONS | CLERK | 1
BOSTON | OPERATIONS | MANAGER | 1
BOSTON | OPERATIONS | | 3
BOSTON | RESEARCH | ANALYST | 2
BOSTON | RESEARCH | CLERK | 2
BOSTON | RESEARCH | MANAGER | 1
BOSTON | RESEARCH | | 5
BOSTON | | ANALYST | 3
BOSTON | | CLERK | 3
BOSTON | | MANAGER | 2
BOSTON | | | 8
CHICAGO | SALES | CLERK | 1
CHICAGO | SALES | MANAGER | 1
CHICAGO | SALES | SALESMAN | 4
CHICAGO | SALES | | 6
CHICAGO | | CLERK | 1
CHICAGO | | MANAGER | 1
CHICAGO | | SALESMAN | 4
CHICAGO | | | 6
NEW YORK | ACCOUNTING | CLERK | 1
NEW YORK | ACCOUNTING | MANAGER | 1
NEW YORK | ACCOUNTING | PRESIDENT | 1
NEW YORK | ACCOUNTING | | 3
NEW YORK | | CLERK | 1
NEW YORK | | MANAGER | 1
NEW YORK | | PRESIDENT | 1
ニューヨーク | | | | 3
(28行)