分组原理(GROUP BY子句)2:GROUPING SETS选项(分组集)

分组原理(GROUP BY子句)2:GROUPING SETS选项(分组集)

若觉得本文写得还可以,请多多关注本人所作书籍《C++语法详解》电子工业出版社出版,作者 黄勇,网盘地址:
https://pan.baidu.com/s/1dIxLMN5b91zpJN2sZv1MNg

本文为原创文章,转载请注明出处,或注明转载自“黄邦勇帅(原名:黄勇)

二、GROUPING SETS选项(分组集)
1、分组集就是把GROUP BY分组后得到的所有分组作为一个集合,也就是说,分组集是分组的集合,因此如下语句的分组仅得到一个分组集,即由列a和b分组后得到的所有分组所组成的集合,可简记为(a, b),注意:(a, b)表示的是一个集合,其元素是使用列a和b分组后得到的分组,若把(a, b)使用一个字母比如A或B来代表分组集可能更容易理解。

SELECT a,b FROM T3 GROUP BY a,b

同理,使用如下语句将得到两个分组集

SELECT a,b FROM T4 GROUP BY a,b		--分组集1
SELECT a,c FROM T4 GROUP BY a,c		--分组集2

2、使用GROUPINGS SETS选项可把多个分组集合并在一起,其效果是把多个含有相应分组集的结果集使用UNION ALL运算符进行合并,比如以下示例中的语句1与语句2是等效的,其输出结果见图XXX

示例5.05:分组集(GROUPING SETS选项)原理
SELECT a,b,c FROM T4 GROUP BY GROUPING SETS(    --语句1
(a,b),			--分组集1:(a,b),把每个分组集使用括号括起来并使用逗号隔开
(a,c) )		--分组集2:(a,c)
/*由于UNION ALL要求所有查询的结果集包含相同的列数,所以以下语句使用NULL作为占位符,以对查询结果的列进行调整*/
SELECT a,NULL AS b,c FROM T4 GROUP BY a,c		--语句2,等效于语句1
UNION ALL
SELECT a,b,NULL AS c FROM T4 GROUP BY a,b

在这里插入图片描述

3、注意:省略GROUPING SETS内层的括号得到的将是分别由各个元素组成的单个分组集,比如GROUPING SETS(a, b, c)相当于定义了3个分组集,而GROUPING SETS( (a, b, c) )则只定义了一个分组集
4、使用GROUPINGS SETS选项与使用UNION ALL合并分组集的优缺点
使用UNION ALL合并分组集的缺点是代码太长并且性能比较低下,因为每一个查询都会分别单独扫描一次源表,所以性能比较低下。使用GROUPINGS SETS选项合并分组集可明显减少代码长度,并且能够优化扫描源表的次数,不必为每个分组集单独对表源进行扫描,从而提高性能。
5、在同一个GROUP BY子句中,也可以使用逗号分隔的多个GROUPING SETS子句,比如,

GROUP BY GROUPING SETS(a, b), GROUPING SETS(c, d)	

该语句的规则,详见后文。

三、( )选项
1、( )选项表示不对当前表进行分组,通常用于生成一个类似于ROLLUP进行“总计(或汇总)”功能的NULL组,()不能用于ROLLUP和CUBE子句中,通常将()用于不含ROLLUP或CUBE子句的GROUPING SETS选项中用于进行类似“总计”功能的计算
在这里插入图片描述

作者:黄邦勇帅(原名:黄勇)
在这里插入图片描述

`GROUP BY GROUPING SETS` 是 MySQL 中用于多维度分组聚合的语法,它可以同时对多个字段进行分组,以生成多维度的聚合数据。 `GROUP BY GROUPING SETS` 的语法如下: ```sql SELECT 列1, 列2, ..., 聚合函数1(列), 聚合函数2(列), ... FROM 表名 GROUP BY GROUPING SETS((列1, 列2, ...), (列1, ...), ..., ()) ``` 其中,`GROUPING SETS` 后面的括号中可以指定多个聚合维度,每个聚合维度用括号括起来,不同的聚合维度之间用逗号分隔。括号中的字段可以是表中的任意字段,也可以是表达式或者常量。括号中的字段数量不限,但是字段的顺序必须与 `SELECT` 子句中的顺序一致。 在使用 `GROUP BY GROUPING SETS` 时,如果某个聚合维度为空(即对应的括号中没有任何字段),则表示对所有的分组结果进行汇总(类似于 `WITH ROLLUP`)。如果同时使用多个聚合维度,则会生成多维度的聚合数据。 下面是一个示例,展示如何使用 `GROUP BY GROUPING SETS` 计算一张订单表的不同日期、不同用户、不同商品的销售数量和销售额: ```sql SELECT 日期, 用户, 商品, COUNT(*) AS 销售数量, SUM(金额) AS 销售额 FROM 订单表 GROUP BY GROUPING SETS((日期, 用户, 商品), (日期, 用户), (日期), ()) ORDER BY 日期, 用户, 商品; ``` 在上面的查询中,我们同时对日期、用户和商品进行了分组,并分别计算了销售数量和销售额。聚合维度包括: - `(日期, 用户, 商品)`:按照日期、用户、商品三个维度进行聚合 - `(日期, 用户)`:按照日期、用户两个维度进行聚合 - `(日期)`:按照日期一个维度进行聚合 - `()`:对所有结果进行汇总 运行上述查询后,可以得到一个多维度的聚合结果,包括日期、用户、商品、销售数量和销售额。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值