GROUP BY你都不会!ROLLUP,CUBE,GROUPPING详解

栏目: 数据库 · 发布时间: 6年前

内容简介:今天就带大家了解一下Group By 的新用法吧。ROLL UP 搭配 GROUP BY 使用,可以为每一个分组返回一个小计行,为所有分组返回一个总计行。直接看例子,我们有以下数据表,包含工厂列,班组列,数量列三列。

Group By

Group By 谁不会啊?这不是最简单的吗?越是简单的东西,我们越会忽略掉他,因为我们不愿意再去深入了解它。

1 小时 SQL 极速入门(一)

1 小时 SQL 极速入门(二)

1 小时 SQL 极速入门(三)——Oracle 分析函数

SQL 高级查询——(层次化查询,递归)

今天就带大家了解一下Group By 的新用法吧。

ROLL UP

ROLL UP 搭配 GROUP BY 使用,可以为每一个分组返回一个小计行,为所有分组返回一个总计行。

直接看例子,我们有以下数据表,包含工厂列,班组列,数量列三列。

GROUP BY你都不会!ROLLUP,CUBE,GROUPPING详解

当向 ROLLUP 传入一列时,会得到一个总计行。

SELECT factory,
  SUM(quantity)
FROM production
GROUP BY ROLLUP(factory)
ORDER BY factory

结果:

GROUP BY你都不会!ROLLUP,CUBE,GROUPPING详解

当向 ROLLUP 传递两列时,将会按照这两列进行分组,同时按照第一列的分组结果返回小计行。我们同时传入工厂和部门看一下。

SELECT factory,department,
  SUM(quantity)
FROM production
GROUP BY ROLLUP(factory, department)
ORDER BY factory

结果:

GROUP BY你都不会!ROLLUP,CUBE,GROUPPING详解

可以看到对每一个工厂都有一个小计行,最后对所有的有一个总计行。也可以这样理解

如果 ROLLUP(A,B)则先对 A,B进行 GROUP BY,之后对 A 进行 GROUP BY,最后对全表 GROUP BY。

如果 ROLLUP(A,B,C)则先对 A,B,C进行 GROUP BY ,然后对 A,B进行GROUP BY,再对 A 进行GROUP BY,最后对全表进行 GROUP BY.

CUBE

CUBE 和 ROLLUP 对参数的处理是不同的,我们可以这样理解。

如果 CUBE(A,B)则先对 A,B 进行 GROUP BY,之后对 A 进行 GROUP BY,然后对 B 进行 GROUP BY,最后对全表进行 GROUP BY.

如果 CUBE(A,B,C)则先对 A,B,C 进行 GROUP BY,之后对 A,B ,之后对A,C ,之后对 B,C 之后对 A,之后对 B,之后对 C,最后对全表GROUP BY

看一个简单的例子:

SELECT factory,department,
  SUM(quantity)
FROM production
GROUP BY CUBE(factory, department)
ORDER BY factory,department;

结果:

GROUP BY你都不会!ROLLUP,CUBE,GROUPPING详解

可以看出来首先对 FACTORY,DEPARTMENT进行分组汇总,然后对FACTORY 分组汇总,之后对 DEPARTMENT 分组汇总,最后有一行全表汇总。

GROUPING

GROUPING()函数只能配合 ROLLUP 和 CUBE 使用,GROUPING()接收一列,如果此列不为空则返回0,如果为空则返回1.

我们用第一个ROLLUP例子举例

SELECT GROUPING(factory),
  factory,
  department,
  SUM(quantity)
FROM production
GROUP BY ROLLUP(factory, department)
ORDER BY factory,
  department;

结果:

GROUP BY你都不会!ROLLUP,CUBE,GROUPPING详解

看到,最后一行的 FACTORY 为空,所以 GROUPING()返回 1.也可以与CUBE结合使用,方法是一样的。

GROUPING SETS

GROUPING SETS 与 CUBE 有点类似,CUBE是对参数进行自由组合进行分组。GROUPING SETS则对每个参数分别进行分组,GROUPING SETS(A,B)就代表先按照 A 分组,再按照 B分组。

SELECT factory,
  department,
  SUM(quantity)
FROM production
GROUP BY GROUPING SETS(factory, department)
ORDER BY factory,
  department

结果:

GROUP BY你都不会!ROLLUP,CUBE,GROUPPING详解

可以看出来结果是按照工厂和部门分别分组汇总的。

GROUPING_ID()

GROUPING_ID()配合GROUPING()函数使用,GROUPING_ID(A,B)的值由GROUPING(A)与GROUPING(B)的值决定,如果GROUPING(A)为1,GROUPING(B)为0,则GROUPING_ID(A,B)的值为 10,十进制的 3.

SELECT factory,
  department,
  GROUPING(factory),
  GROUPING(department),
  GROUPING_ID(factory,department),
  SUM(quantity)
FROM production
GROUP BY CUBE(factory, department)
ORDER BY factory,
  department;

结果:

GROUP BY你都不会!ROLLUP,CUBE,GROUPPING详解

有了GROUPING_ID列,我们就可以使用 HAVING 字句来对查询结果进行过滤。选择GROUPING_ID=0的就表示 FACTORY,DEPARTMENT两列都不为空。


以上所述就是小编给大家介绍的《GROUP BY你都不会!ROLLUP,CUBE,GROUPPING详解》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

腾讯之道

腾讯之道

艾永亮、刘官华、梁璐 / 机械工业出版社 / 2016-7-19 / 59

放眼整个中国乃至全球,腾讯都是一家成功的互联网企业,它代表中国企业在世界互联网版图中竖起了一面高高的旗帜。腾讯为何能取得如此大的成就,它的成功方法和商业逻辑是什么?你是不是和无数中国企业和商界人士一样,都想向腾讯取取经,但是又不得其门而入? 腾讯一直以低调、务实著称,所 以腾讯及其内部员工都极少对外界分享他们的经验;加之腾讯的商业模式多元、业务繁多且交叉、体量又极其庞大,使得从外部来系统研究......一起来看看 《腾讯之道》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

MD5 加密
MD5 加密

MD5 加密工具