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

Group By

Group By 谁不会啊?这不是最简单的吗?越是简单的东西,咱们越会忽略掉他,由于咱们不肯意再去深刻了解它。
1 小时 SQL 极速入门(一)
1 小时 SQL 极速入门(二)
1 小时 SQL 极速入门(三)——Oracle 分析函数
SQL 高级查询——(层次化查询,递归)sql

今天就带你们了解一下Group By 的新用法吧。segmentfault

ROLL UP

ROLL UP 搭配 GROUP BY 使用,能够为每个分组返回一个小计行,为全部分组返回一个总计行。函数

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

表结构.png

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

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

结果:递归

ROLLUP1.PNG

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

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

结果:it

ROLLUP2.png

能够看到对每个工厂都有一个小计行,最后对全部的有一个总计行。也能够这样理解 io

若是 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;

结果:

CUBE.png

能够看出来首先对 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;

结果:

GROUPING.png

看到,最后一行的 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

结果:

GROUPINGSETS.PNG

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

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;

结果:

GROUPINGID.png

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

相关文章
相关标签/搜索