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, ...) 的组合,以指定的为准),将为每个唯一值返回一个小计;对于列表中的第二项(expr_2 或 ( expr_2a, expr_2b, ...) 的组合,以指定的为准),将为每个唯一值返回一个小计。此外,还将为第一项和第二项的每个唯一组合返回一个小计。如果存在第三项,则会为第三项的每个唯一值、第三项和第一项组合的每个唯一值、第三项和第二项组合的每个唯一值以及第三项、第二项和第一项组合的每个唯一值返回一个小计。最后,将为整个结果集返回一个总计。
  • 对于小计行,将为小计包含的各项返回 null。

示例

以下示例为 GROUPBY 子句中指定的 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 子句。如果未指定 ORDERBY 子句,则无法保证结果集的顺序。
  • 分组级别数或总计数为 2 的 n 次幂,其中 n 表示 CUBE 表达式列表中的项数。带圆括号的列表计为一项。

以下查询基于 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)