暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

GROUP BY CUBE介绍

原创 努力努力再努力 2024-11-02
306

基本功能介绍

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或特定标记)。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论