CUBE 拡張は ROLLUP 拡張に似ています。 ただし、ROLLUP 拡張は、ROLLUP 式リスト内に右から左の順でリスト化された項目に基づいて階層構造でグループと結果を生成します。 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, ...) の組み合わせです。 最初の項目と 2 番目の項目によって、一意の各組み合わせの小計も返されます。 同様に、3 番目の項目が存在する場合、 3 番目の項目による一意の各値の小計が返され、3 番目の項目と最初の項目による一意の各組み合わせの小計が返されます。そして、3 番目の項目と 2 番目の項目による一意の各組み合わせの小計が返され、3 番目の項目、2 番目の項目、および最初の項目による一意の各組み合わせの小計が返されます。 最後に、結果セット全体の総計が返されます。

小計行の場合、小計の項目に対して 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 "employees" FROM emp e, dept d
WHERE e.deptno = d.deptno
GROUP BY CUBE (loc, dname, job)
ORDER BY 1, 2, 3;

以下は、この例はクエリの結果を示しています。 システムにより、loc、dname、および job の組み合わせごとに従業員数が計算されます。 さらに、loc と dname の各組み合わせ、loc と job の各組み合わせ、dname と job の各組み合わせ、loc の各一意の値、dname の各一意の値、および job の各一意の値の小計が計算されます。 そして、最終行に表示される総計が生成されます。

   loc    |   dname    |    job    | employees
----------+------------+-----------+-----------
 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 rows)

次のクエリは、CUBE リスト内の項目を括弧内で組み合わせる方法を示しています。

SELECT loc, dname, job, COUNT(*) AS "employees" FROM emp e, dept d
WHERE e.deptno = d.deptno
GROUP BY CUBE (loc, (dname, job))
ORDER BY 1, 2, 3;

以下の出力では、loc と dname の組み合わせと loc と job の組み合わせを含む順列の小計、また dname または job の小計は生成されないことが示されています。

   loc    |   dname    |    job    | employees
----------+------------+-----------+-----------
 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 rows)

次のクエリは、最初の式が CUBE 拡張外で指定される別のバリエーションを示しています。

SELECT loc, dname, job, COUNT(*) AS "employees" FROM emp e, dept d
WHERE e.deptno = d.deptno
GROUP BY loc, CUBE (dname, job)
ORDER BY 1, 2, 3;

以下の出力では、loc の各グループ内の dname と job に対して順列が実行されます。

   loc    |   dname    |    job    | employees
----------+------------+-----------+-----------
 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
(28 rows)