GBase 8s
其他
文章

南大通用GBase8s GROUP BY CUBE介绍

发表于2025-11-19 17:55:40290次浏览4个评论

基本功能介绍


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.

这条语句将生成以下类型的行:

  • 各个年份和地区的具体销售额(如2020年、北美地区的销售额)。
  • 各个年份的总销售额(如2020年的总销售额,地区列为NULL或特定标记)。
  • 各个地区的总销售额(如北美地区的总销售额,年份列为NULL或特定标记)。
  • 所有年份和地区的总销售额(年份和地区列均为NULL或特定标记)。
     

以上为GBase8s  GROUP BY CUBE的简单介绍,如果在使用过程中遇到任何问题,欢迎随时在社区中提问,我们在这里为你提供支持。

评论

登录后才可以发表评论
用户头像
郝老师发表于 8个月前
CUBE 属于 OLAP 函数,8a 就是这么分类的,建议修改标题,不仅仅提升高大尚,更重要的是保证一个公司文档的统一
用户头像
路路路发表于 8个月前
@郝老师:已与作者沟通,修改标题,感谢提醒
用户头像
GBase用户28017发表于 8个月前
学习。
白芷发表于 2个月前
来了