摘要:在本教程中,你将学习如何使用 SQL CUBE
为查询输出生成小计。
SQL CUBE 简介
与 ROLLUP
类似,CUBE
是 GROUP BY
子句的扩展。CUBE
允许你像 ROLLUP
扩展那样生成小计。此外,CUBE
扩展将生成 GROUP BY
子句中指定的所有组合的分组列的小计。
下面说明了 CUBE
扩展的语法
SELECT
c1, c2, AGGREGATE_FUNCTION(c3)
FROM
table_name
GROUP BY CUBE(c1 , c2);
Code language: SQL (Structured Query Language) (sql)
在此语法中,我们在 CUBE
中指定了两个列。此语句创建两个小计组合。通常,如果你的 CUBE
中列出了 n 个列,该语句将创建 2n 个小计组合。
SQL CUBE 示例
我们将重新使用 ROLLUP
教程中创建的 inventory
表。
带有单列的 SQL CUBE 示例
下面的语句使用 SUM()
函数和 GROUP BY
子句查找每个仓库的总库存
SELECT
warehouse,
SUM(quantity)
FROM
inventory
GROUP BY
warehouse;
Code language: SQL (Structured Query Language) (sql)

如果你想了解所有仓库的总库存,可以使用 GROUP BY
子句中的 CUBE
扩展,如下所示
SELECT
warehouse,
SUM(quantity)
FROM
inventory
GROUP BY
CUBE(warehouse)
ORDER BY
warehouse;
Code language: SQL (Structured Query Language) (sql)

在此示例中,CUBE
扩展在 warehouse
列中添加了含有空值的总库存行。效果与 ROLLUP
函数相同。为了使输出更具可读性,你可以使用 COALESCE()
函数,如下所示
SELECT
COALESCE(warehouse,'All warehouses'),
SUM(quantity)
FROM
inventory
GROUP BY
CUBE(warehouse)
ORDER BY
warehouse;
Code language: SQL (Structured Query Language) (sql)

带有多列的 SQL CUBE 示例
下面的语句查找按仓库和产品划分的总库存
SELECT
warehouse,
product,
SUM(quantity)
FROM
inventory
GROUP BY
warehouse,product
ORDER BY
warehouse,
product;
Code language: SQL (Structured Query Language) (sql)

在使用 CUBE
函数时,该查询执行四个小计
SELECT
warehouse,
product,
SUM(quantity)
FROM
inventory
GROUP BY
CUBE(warehouse,product)
ORDER BY
warehouse,
product;
Code language: SQL (Structured Query Language) (sql)

如你所见,在输出中我们有四个小计行
- 第三和第六行显示了
San Francisco
和San Jose
仓库中所有产品的总库存。product
列中的值为空。 - 第七和第八行显示所有仓库中
Samsung
和iPhone
等产品的总库存。因此,warehouse
列中的值为空。
最后一列是显示所有仓库总库存的总计。
下面的语句使用 COALESCE()
函数将 Null 值替换为更有意义的数据
SELECT
COALESCE(warehouse, '...All Warehouses') warehouse,
COALESCE(product, '...All Products') product,
SUM(quantity)
FROM
inventory
GROUP BY
CUBE(warehouse,product)
ORDER BY
warehouse,
product;
Code language: SQL (Structured Query Language) (sql)

制作交叉表报表
下面的查询使用 CUBE 扩展从示例数据库中的 employees
表中检索数据以创建交叉表报表
SELECT
COALESCE(department_name, '-') department,
COALESCE(job_title,'-') job,
COUNT(*) ,
SUM(salary) salary
FROM
employees
INNER JOIN departments USING (department_id)
INNER JOIN jobs USING (job_id)
GROUP BY
CUBE(department_name,job_title)
ORDER BY
department_name ASC NULLS LAST;
Code language: SQL (Structured Query Language) (sql)
结果如下所示
部门 | 工作 | 计数(*) | 工资 |
会计 | 会计经理 | 1 | 12000 |
会计 | 公共会计师 | 1 | 8300 |
会计 | – | 2 | 20300 |
管理 | 行政助理 | 1 | 4400 |
管理 | – | 1 | 4400 |
主管 | 行政副总裁 | 2 | 34000 |
主管 | 总裁 | 1 | 24000 |
主管 | – | 3 | 58000 |
财务 | 会计 | 5 | 39600 |
财务 | 财务经理 | 1 | 12000 |
财务 | – | 6 | 51600 |
人力资源 | 人力资源代表 | 1 | 6500 |
人力资源 | – | 1 | 6500 |
IT | 程序员 | 5 | 28800 |
IT | – | 5 | 28800 |
营销 | 营销经理 | 1 | 13000 |
营销 | 营销代表 | 1 | 6000 |
营销 | – | 2 | 19000 |
公共关系 | 公共关系代表 | 1 | 10000 |
公共关系 | – | 1 | 10000 |
采购 | 采购员 | 5 | 13900 |
采购 | 采购经理 | 1 | 11000 |
采购 | – | 6 | 24900 |
销售 | 销售经理 | 2 | 27500 |
销售 | 销售代表 | 3 | 24000 |
销售 | – | 5 | 51500 |
运输 | 运输员 | 2 | 7900 |
运输 | 仓库员 | 1 | 2700 |
运输 | 仓库经理 | 4 | 30600 |
运输 | – | 7 | 41200 |
– | 会计 | 5 | 39600 |
– | 会计经理 | 1 | 12000 |
– | 行政助理 | 1 | 4400 |
– | 行政副总裁 | 2 | 34000 |
– | 财务经理 | 1 | 12000 |
– | 人力资源代表 | 1 | 6500 |
– | 营销经理 | 1 | 13000 |
– | 营销代表 | 1 | 6000 |
– | 总裁 | 1 | 24000 |
– | 程序员 | 5 | 28800 |
– | 公共会计师 | 1 | 8300 |
– | 公共关系代表 | 1 | 10000 |
– | 采购员 | 5 | 13900 |
– | 采购经理 | 1 | 11000 |
– | 销售经理 | 2 | 27500 |
– | 销售代表 | 3 | 24000 |
– | 运输员 | 2 | 7900 |
– | 仓库员 | 1 | 2700 |
– | 仓库经理 | 4 | 30600 |
– | – | 39 | 316200 |
在本教程中,你已学习了如何使用 SQL CUBE
扩展功能在查询输出中生成小计。
本教程是否对你有帮助?