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兩列都不爲空。

相關文章
相關標籤/搜索