多维分析指数据仓库应用程序中使用各种维度组合检查数据的常用过程。维度是用于划分数据(如时间、地理位置、公司部门、产品系列等)的类别。与一组特定的维度关联的结果称为事实。事实通常是与产品销售、利润、数量、计数等关联的数字。

为了在关系数据库系统中根据一组维度获取这些事实,通常将使用 SQL 聚合。SQL 聚合基本上意味着数据是根据特定的标准(维度)分组的,结果集由事实的聚合(例如,每组数据的计数、总和及平均值)组成。

SQL SELECT 命令的 GROUP BY 子句支持以下扩展,这些扩展可简化生成聚合结果的过程。

  • ROLLUP 扩展
  • CUBE 扩展
  • GROUPING SETS 扩展

此外,还可在 SELECT 列表或 HAVING 子句中使用 GROUPING 函数和 GROUPING_ID 函数,以便在使用这些扩展时帮助解释结果。

为了举例说明用法,在本次讲述中广泛使用了 dept 和 emp 示例表。对这些表应用了以下更改,以提供更多信息性的结果。

UPDATE dept SET loc = 'BOSTON' WHERE deptno = 20;
INSERT INTO emp (empno,ename,job,deptno) VALUES (9001,'SMITH','CLERK',40);
INSERT INTO emp (empno,ename,job,deptno) VALUES (9002,'JONES','ANALYST',40);
INSERT INTO emp (empno,ename,job,deptno) VALUES (9003,'ROGERS','MANAGER',40);

将使用通过联结 emp 和 dept表所生成的以下行:

SELECT loc, dname, job, empno FROM emp e, dept d
WHERE e.deptno = d.deptno
ORDER BY 1, 2, 3, 4;

   loc    |   dname    |    job    | empno
----------+------------+-----------+-------
 BOSTON   | OPERATIONS | ANALYST   |  9002
 BOSTON   | OPERATIONS | CLERK     |  9001
 BOSTON   | OPERATIONS | MANAGER   |  9003
 BOSTON   | RESEARCH   | ANALYST   |  7788
 BOSTON   | RESEARCH   | ANALYST   |  7902
 BOSTON   | RESEARCH   | CLERK     |  7369
 BOSTON   | RESEARCH   | CLERK     |  7876
 BOSTON   | RESEARCH   | MANAGER   |  7566
 CHICAGO  | SALES      | CLERK     |  7900
 CHICAGO  | SALES      | MANAGER   |  7698
 CHICAGO  | SALES      | SALESMAN  |  7499
 CHICAGO  | SALES      | SALESMAN  |  7521
 CHICAGO  | SALES      | SALESMAN  |  7654
 CHICAGO  | SALES      | SALESMAN  |  7844
 NEW YORK | ACCOUNTING | CLERK     |  7934
 NEW YORK | ACCOUNTING | MANAGER   |  7782
 NEW YORK | ACCOUNTING | PRESIDENT |  7839
(17 rows)

loc、dname 和 job 列用于示例中使用的 SQL 聚合的维度。这些聚合生成的事实是使用 COUNT(*) 函数获取的员工数。

下面给出了对 loc、dname 和 job 列进行分组的基本查询。

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

使用不带扩展的基本 GROUP BY 子句生成的此结果集的行称为基础聚合行。

   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
 CHICAGO  | SALES      | CLERK     |         1
 CHICAGO  | SALES      | MANAGER   |         1
 CHICAGO  | SALES      | SALESMAN  |         4
 NEW YORK | ACCOUNTING | CLERK     |         1
 NEW YORK | ACCOUNTING | MANAGER   |         1
 NEW YORK | ACCOUNTING | PRESIDENT |         1
(12 rows)

ROLLUP 和 CUBE 扩展通过为结果集提供小计的其他级别,添加到基础聚合行。

GROUPING SETS 扩展提供将不同类型的分组合并到单个结果集的功能。

GROUPING 和 GROUPING_ID 函数帮助解释结果集。

这些扩展提供的附加内容将在后面的章节中更详细地讨论。