基本功能介绍
CUBE(交叉列表)也是对group by运算的一种扩展,它比ROLLUP扩展更加精细,组合类型更多,ROLLUP是按组合的列从右到左递减分组计算,而CUBE则是对所有可能的组合情况进行分组,这样分组的情况更多,覆盖所有的可能分组,并计算所有可能的分组的小计。
基本语法:
SELECT 列1, 列2, ...
FROM 表名
GROUP BY CUBE(列1, 列2, ...);
使用时,系统首先按照指定的多列进行分组,然后将多组结果集进行 UNION ALL 。
分组个数为:2 的列个数次方个。
分组方式为:按照所有排列组合的子集进行分组,不参与分组的列对应结果集内容为NULL ,返回以上分组结果。
假如, CUBE 分组列为 (A, B, C) ,则首先对 (A,B,C) 进行分组,然后依次对 (A,B)、(A,C)、(A)、(B,C)、(B)、(C)、无分组列 八种情况进行分组,最后进行查询。当某种分组组合未使用到某分组列,且投影列存在该列,则对应结果集设置为 NULL 。
ROLLUP和 CUBE 区别:
如果是ROLLUP(A,B, C)的话,GROUP BY顺序
(A、B、C)
(A、B)
(A)
最后对全表进行GROUP BY操作。
如果是GROUP BY CUBE(A, B, C),GROUP BY顺序
(A、B、C)
(A、B)
(A、C)
(A)
(B、C)
(B)
(C)
最后对全表进行GROUPBY操作。
注意事项:
GROUP BY CUBE生成的结果集可能非常大,特别是当指定的维度较多时。因此,在使用时需要谨慎考虑性能问题。。
示例
假设有一个销售数据表sales,包含字段year(年份)、region(地区)和sales(销售额)。如果我们想要对这两个维度(年份和地区)进行CUBE操作,以获取不同年份、不同地区以及它们所有组合的销售额小计和总计,我们可以使用以下SQL语句:
示例数据库版本为:GBase8sV8.8_3.5.1
--创建 sales 表 > CREATE TABLE sales ( id INT PRIMARY KEY, year INT, region VARCHAR(50), sales DECIMAL(10, 2) ); --插入数据 INSERT INTO sales (id,year, region, sales) VALUES (1,2020, '华北', 10000.00); INSERT INTO sales (id,year, region, sales) VALUES (2,2020, '华南', 15000.00); INSERT INTO sales (id,year, region, sales) VALUES (3,2021, '华北', 12000.00); INSERT INTO sales (id,year, region, sales) VALUES (4,2021, '华南', 18000.00); INSERT INTO sales (id,year, region, sales) VALUES (5,2021, '华东', 20000.00); --以下是一个使用GROUP BY CUBE的示例查询: > SELECT year, region, SUM(sales) AS total_sales FROM sales GROUP BY CUBE(year, region); year region total_sales 75000.00 year 2020 region total_sales 25000.00 year 2021 region total_sales 50000.00 year region 华北 total_sales 22000.00 year region 华东 total_sales 20000.00 year region 华南 total_sales 33000.00 year 2021 region 华南 total_sales 18000.00 year 2020 region 华南 total_sales 15000.00 year 2021 region 华北 total_sales 12000.00 year 2021 region 华东 total_sales 20000.00 year 2020 region 华北 total_sales 10000.00 11 row(s) retrieved.这条语句将生成以下类型的行:
|




