摘要:當(dāng)向傳入一列時,會得到一個總計行。結(jié)果當(dāng)向傳遞兩列時,將會按照這兩列進(jìn)行分組,同時按照第一列的分組結(jié)果返回小計行。結(jié)果可以看出來結(jié)果是按照工廠和部門分別分組匯總的。選擇的就表示兩列都不為空。
Group By
Group By 誰不會啊?這不是最簡單的嗎?越是簡單的東西,我們越會忽略掉他,因為我們不愿意再去深入了解它。
1 小時 SQL 極速入門(一)
1 小時 SQL 極速入門(二)
1 小時 SQL 極速入門(三)——Oracle 分析函數(shù)
SQL 高級查詢——(層次化查詢,遞歸)
今天就帶大家了解一下Group By 的新用法吧。
ROLL UPROLL UP 搭配 GROUP BY 使用,可以為每一個分組返回一個小計行,為所有分組返回一個總計行。
直接看例子,我們有以下數(shù)據(jù)表,包含工廠列,班組列,數(shù)量列三列。
當(dāng)向 ROLLUP 傳入一列時,會得到一個總計行。
SELECT factory, SUM(quantity) FROM production GROUP BY ROLLUP(factory) ORDER BY factory
結(jié)果:
當(dāng)向 ROLLUP 傳遞兩列時,將會按照這兩列進(jìn)行分組,同時按照第一列的分組結(jié)果返回小計行。我們同時傳入工廠和部門看一下。
SELECT factory,department, SUM(quantity) FROM production GROUP BY ROLLUP(factory, department) ORDER BY factory
結(jié)果:
可以看到對每一個工廠都有一個小計行,最后對所有的有一個總計行。也可以這樣理解
如果 ROLLUP(A,B)則先對 A,B進(jìn)行 GROUP BY,之后對 A 進(jìn)行 GROUP BY,最后對全表 GROUP BY。
如果 ROLLUP(A,B,C)則先對 A,B,C進(jìn)行 GROUP BY ,然后對 A,B進(jìn)行GROUP BY,再對 A 進(jìn)行GROUP BY,最后對全表進(jìn)行 GROUP BY.
CUBECUBE 和 ROLLUP 對參數(shù)的處理是不同的,我們可以這樣理解。
如果 CUBE(A,B)則先對 A,B 進(jìn)行 GROUP BY,之后對 A 進(jìn)行 GROUP BY,然后對 B 進(jìn)行 GROUP BY,最后對全表進(jìn)行 GROUP BY.
如果 CUBE(A,B,C)則先對 A,B,C 進(jìn)行 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;
結(jié)果:
可以看出來首先對 FACTORY,DEPARTMENT進(jìn)行分組匯總,然后對FACTORY 分組匯總,之后對 DEPARTMENT 分組匯總,最后有一行全表匯總。
GROUPINGGROUPING()函數(shù)只能配合 ROLLUP 和 CUBE 使用,GROUPING()接收一列,如果此列不為空則返回0,如果為空則返回1.
我們用第一個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 SETSGROUPING SETS 與 CUBE 有點(diǎn)類似,CUBE是對參數(shù)進(jìn)行自由組合進(jìn)行分組。GROUPING SETS則對每個參數(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 字句來對查詢結(jié)果進(jìn)行過濾。選擇GROUPING_ID=0的就表示 FACTORY,DEPARTMENT兩列都不為空。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/17929.html
閱讀 2577·2021-11-25 09:43
閱讀 1848·2021-09-22 15:26
閱讀 3695·2019-08-30 15:56
閱讀 1701·2019-08-30 15:55
閱讀 1889·2019-08-30 15:54
閱讀 804·2019-08-30 15:52
閱讀 3134·2019-08-29 16:23
閱讀 886·2019-08-29 12:43