聊聊SQL中的分组集

数据库 MySQL
SQL Server的分组集共有三种 GROUPING SETS, CUBE, 以及ROLLUP, 其中 CUBE和ROLLUP可以当做是GROUPING SETS的简写版。

[[421386]]

本文转载自微信公众号「SQL数据库开发」,作者丶平凡世界  。转载本文请联系SQL数据库开发公众号。

分组集的定义

是多个分组的并集,用于在一个查询中,按照不同的分组列对集合进行聚合运算,等价于对单个分组使用"UNION ALL",计算多个结果集的并集。

分组集种类

SQL Server的分组集共有三种 GROUPING SETS, CUBE, 以及ROLLUP, 其中 CUBE和ROLLUP可以当做是GROUPING SETS的简写版

GROUPING SETS

GROUPING SETS子句允许你指定多个GROUP BY选项。增强了GROUP BY的功能。

可以通过一条SELECT语句实现复杂繁琐的多条SELECT语句的查询。并且更加的

高效,解析存储一条SQL于语句

GROUP SETS示例

我们以Customers表为例,其内容如下:

我们先分别对城市和省份进行分组,统计出他们的数量

  1. SELECT 城市,NULL 省份,COUNT(城市) FROM Customers 
  2. GROUP BY 城市 
  3. UNION ALL 
  4. SELECT NULL,省份,COUNT(省份) FROM Customers 
  5. GROUP BY 省份 

结果为:

再使用GROUPING SETS来统计

  1. SELECT  
  2. 城市, 
  3. 省份, 
  4. COUNT(客户ID) 数量  
  5. FROM Customers 
  6. GROUP BY GROUPING SETS (城市,省份) 

结果如下

其实上下两个结果是一样的,只是UNION ALL不排序,而GROUPING SETS增加了排序。这样不仅减少了代码,而且这样的效率会比UNION ALL的效率高。通常GROUPING SETS使用在组合分析中。

ROLLUP

ROLLUP也是GROUPING SETS的一种简略写法,我们举例说明。

我们先使用GROUPING SETS的多层组合

  1. SELECT  
  2. 省份, 
  3. 城市, 
  4. COUNT(1) 数量  
  5. FROM Customers 
  6. GROUP BY GROUPING SETS ( 
  7. 省份,(省份,城市) 

其结果为:

我们使用ROLLUP可以这样写

  1. SELECT  
  2. 省份, 
  3. 城市, 
  4. COUNT(客户ID) 数量  
  5. FROM Customers 
  6. GROUP BY 省份,城市 WITH ROLLUP 

其结果为:

我们来解读一下ROLLUP的作用,其作用是对每个列先进行一次分组,并且对第一列的数据在每个组内还进行一次汇总,最后对所有的数据再进行一次汇总,所以相比GROUPING SETS会多了个所以数据的汇总。这个在对组内进行聚合时是经常使用到的。

CUBE

而CUBE相比ROLLUP就更多一个维度了,我们还是距离说明。

  1. SELECT  
  2. 省份, 
  3. 城市, 
  4. COUNT(客户ID) 数量  
  5. FROM Customers 
  6. GROUP BY 省份,城市 WITH CUBE 

结果如下:

在ROLLUP的基础上,还会将第一列每组的汇总数据额外显示在最后。

总结

 

分组集类似于Excel的透视图,可以对各类数据进行组内计算,这里不止可以进行数量统计,也可以进行求和,最大最小值等操作。是我们在进行数据分析时候经常使用到的一组功能。

 

责任编辑:武晓燕 来源: SQL数据库开发
相关推荐

2023-07-28 09:54:14

SQL数据Excel

2021-08-31 07:54:24

SQLDblink查询

2021-11-09 06:55:03

SQLServer排序

2023-08-29 09:46:12

SQLCTE递归

2021-08-16 08:12:04

SQLMerge用法

2022-08-03 08:11:58

数据测试同类型

2022-10-17 08:22:28

2023-06-05 08:36:04

SQL函数RANK()

2023-10-26 08:38:43

SQL排名平分分区

2022-07-27 08:31:28

SQL开发控制

2010-09-28 10:02:16

SQL查询

2010-07-09 09:24:37

SQL Server分

2023-11-09 11:56:28

MySQL死锁

2010-09-06 14:12:19

SQL相加字段

2010-04-13 11:35:26

Oracle字符集

2021-11-17 08:11:35

MySQL

2021-08-16 06:56:21

Slice数组类型内存

2022-04-02 08:14:02

JavaThreadLoca数据

2021-12-11 19:00:54

Java中断机制

2021-11-10 18:52:42

SQL技巧优化
点赞
收藏

51CTO技术栈公众号