成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

GROUP BY你都不會(huì)!ROLLUP,CUBE,GROUPPING詳解

only_do / 1356人閱讀

摘要:當(dāng)向傳入一列時(shí),會(huì)得到一個(gè)總計(jì)行。結(jié)果當(dāng)向傳遞兩列時(shí),將會(huì)按照這兩列進(jìn)行分組,同時(shí)按照第一列的分組結(jié)果返回小計(jì)行。結(jié)果可以看出來結(jié)果是按照工廠和部門分別分組匯總的。選擇的就表示兩列都不為空。

Group By

Group By 誰不會(huì)???這不是最簡單的嗎?越是簡單的東西,我們越會(huì)忽略掉他,因?yàn)槲覀儾辉敢庠偃ド钊肓私馑?br>1 小時(shí) SQL 極速入門(一)
1 小時(shí) SQL 極速入門(二)
1 小時(shí) SQL 極速入門(三)——Oracle 分析函數(shù)
SQL 高級(jí)查詢——(層次化查詢,遞歸)

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

ROLL UP

ROLL UP 搭配 GROUP BY 使用,可以為每一個(gè)分組返回一個(gè)小計(jì)行,為所有分組返回一個(gè)總計(jì)行。

直接看例子,我們有以下數(shù)據(jù)表,包含工廠列,班組列,數(shù)量列三列。

當(dāng)向 ROLLUP 傳入一列時(shí),會(huì)得到一個(gè)總計(jì)行。

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

結(jié)果:

當(dāng)向 ROLLUP 傳遞兩列時(shí),將會(huì)按照這兩列進(jìn)行分組,同時(shí)按照第一列的分組結(jié)果返回小計(jì)行。我們同時(shí)傳入工廠和部門看一下。

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

結(jié)果:

可以看到對(duì)每一個(gè)工廠都有一個(gè)小計(jì)行,最后對(duì)所有的有一個(gè)總計(jì)行。也可以這樣理解

如果 ROLLUP(A,B)則先對(duì) A,B進(jìn)行 GROUP BY,之后對(duì) A 進(jìn)行 GROUP BY,最后對(duì)全表 GROUP BY。

如果 ROLLUP(A,B,C)則先對(duì) A,B,C進(jìn)行 GROUP BY ,然后對(duì) A,B進(jìn)行GROUP BY,再對(duì) A 進(jìn)行GROUP BY,最后對(duì)全表進(jìn)行 GROUP BY.

CUBE

CUBE 和 ROLLUP 對(duì)參數(shù)的處理是不同的,我們可以這樣理解。

如果 CUBE(A,B)則先對(duì) A,B 進(jìn)行 GROUP BY,之后對(duì) A 進(jìn)行 GROUP BY,然后對(duì) B 進(jìn)行 GROUP BY,最后對(duì)全表進(jìn)行 GROUP BY.

如果 CUBE(A,B,C)則先對(duì) A,B,C 進(jìn)行 GROUP BY,之后對(duì) A,B ,之后對(duì)A,C ,之后對(duì) B,C 之后對(duì) A,之后對(duì) B,之后對(duì) C,最后對(duì)全表GROUP BY

看一個(gè)簡單的例子:

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

結(jié)果:

可以看出來首先對(duì) FACTORY,DEPARTMENT進(jìn)行分組匯總,然后對(duì)FACTORY 分組匯總,之后對(duì) DEPARTMENT 分組匯總,最后有一行全表匯總。

GROUPING

GROUPING()函數(shù)只能配合 ROLLUP 和 CUBE 使用,GROUPING()接收一列,如果此列不為空則返回0,如果為空則返回1.

我們用第一個(gè)ROLLUP例子舉例

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

結(jié)果:

看到,最后一行的 FACTORY 為空,所以 GROUPING()返回 1.也可以與CUBE結(jié)合使用,方法是一樣的。

GROUPING SETS

GROUPING SETS 與 CUBE 有點(diǎn)類似,CUBE是對(duì)參數(shù)進(jìn)行自由組合進(jìn)行分組。GROUPING SETS則對(duì)每個(gè)參數(shù)分別進(jìn)行分組,GROUPING SETS(A,B)就代表先按照 A 分組,再按照 B分組。

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

結(jié)果:

可以看出來結(jié)果是按照工廠和部門分別分組匯總的。

GROUPING_ID()

GROUPING_ID()配合GROUPING()函數(shù)使用,GROUPING_ID(A,B)的值由GROUPING(A)與GROUPING(B)的值決定,如果GROUPING(A)為1,GROUPING(B)為0,則GROUPING_ID(A,B)的值為 10,十進(jìn)制的 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;

結(jié)果:

有了GROUPING_ID列,我們就可以使用 HAVING 字句來對(duì)查詢結(jié)果進(jìn)行過濾。選擇GROUPING_ID=0的就表示 FACTORY,DEPARTMENT兩列都不為空。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/17929.html

相關(guān)文章

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<