group by 後使用 rollup 子句總結

2021-08-21 17:02:01 字數 4679 閱讀 9339

一、如何理解group by帶 rollup子句所產生的效果

group by 後帶 rollup 子句的功能可以理解為:先按一定的規則產生多種分組,然後按各種分組統計資料(至於統計出的資料是求和還是最大值還是平均值等這就取決於select後的聚合函式)。因此要搞懂group by 後帶 rollup 子句的用法主要是搞懂它是如何按一定的規則產生多種分組的group by帶 rollup子句所返回的結果集,可以理解為各個分組所產生的結果集的並集且沒有去掉重複資料。下面舉例說明:

1、對比沒有帶rollup的goup by

例:group by  a ,b

產生的分組種數:1種;

即group by  a,b

返回結果集:也就是這一種分組的結果集。

2、帶rollup但 group by與 rollup之間沒有任何內容

例1:group by  rollup(a ,b)

產生的分組種數:3 種;

第一種:group by  a,b

第二種:group by  a

第三種:group by  null

(說明:本沒有group by  null的寫法,在這裡指是為了方便說明,而採用之。含義是:沒有分組,也就是所有資料做乙個統計。例如聚合函式是sum的話,那就是對所有滿足條件的資料進行求和。此寫法的含義下同)

返回結果集:為以上三種分組統計結果集的並集且未去掉重複資料。

例2:group by  rollup(a ,b,c)

產生的分組種數:4 種;

第一種:group by  a,b,c

第二種:group by  a,b

第三種:group by  a

第四種:group by  null

返回結果集:為以上四種分組統計結果集的並集且未去掉重複資料。

3、帶rollup但 group by與 rollup之間還包含有列資訊

例1:group by  a , rollup(a ,b)

產生的分組種數:3 種;

第一種:group by  a,a,b     等價於 group by  a,b

第二種:group by  a,a       等價於 group by  a

第三種:group by  a,null   等價於 group by  a

返回結果集:為以上三種分組統計結果集的並集且未去掉重複資料。

例2:group by  c , rollup(a ,b)

產生的分組種數:3 種;

第一種:group by  c,a,b    

第二種:group by  c,a      

第三種:group by  c,null   等價於 group by  c

返回結果集:為以上三種分組統計結果集的並集且未去掉重複資料。

4、帶rollup且rollup子句括號內又使用括號對列進行組合

例1:group by  rollup((a ,b))

產生的分組種數:2 種;

第一種:group by  a,b

第二種:group by  null

返回結果集:為以上兩種分組統計結果集的並集且未去掉重複資料。

例2:group by  rollup(a ,(b,c))

產生的分組種數:3 種;

第一種:group by  a,b,c

第二種:group by  a

第三種:group by  null

返回結果集:為以上三種分組統計結果集的並集且未去掉重複資料。

注:對這種情況,可以理解為幾個列被括號括在一起時,就只能被看成乙個整體,分組時不需要再細化。因此也可推斷rollup括號內也頂多加到一重括號,加多重了應該沒有任何意義(這個推斷我沒有做驗證的哦)。

二、與rollup組合使用的其它幾個輔助函式

1、grouping()函式

必須接受一列且只能接受一列做為其引數。引數列值為空返回1,引數列值非空返回0。

2、grouping_id()函式

必須接受一列或多列做為其引數。

返回值為按引數排列順序,依次對各個引數使用grouping()函式,並將結果值依次串成一串二進位制數然後再轉化為十進位製所得到的值。

例如:grouping(a) = 0 ; grouping(b) = 1;

則:grouping_id(a,b)  =  (01)2  = 1;

grouping_id(b,a)  =  (10)2  =2;

3、group_id()函式

呼叫時不需要且不能傳入任何引數。

返回值為某個特定的分組出現的重複次數(第一大點中的第3種情況中往往會產生重複的分組)。重複次數從0開始,例如某個分組第一次出現則返回值為0,第二次出現時返回值為1,……,第n次出現返回值為n-1。

注:使用以上三個函式往往是為了過濾掉一部分統計資料,而達到美化統計結果的作用。

三、group by後帶rollup子句與 group by後帶cube子句區別

group by 後帶rollup子句與 group by 後帶cube子句的唯一區別就是:

帶cube子句的group by 會產生更多的分組統計資料。cube後的列有多少種組合(注意組合是與順序無關的)就會有多少種分組。

例:group by  cube(a ,b,c)

產生的分組種數:8 種;

第一種:group by  a,b,c

第二種:group by  a,b

第三種:group by  a,c

第四種:group by  b,c

第五種:group by  c

第六種:group by  b

第七種:group by  a

第八種:group by  null

返回結果集:為以上八種分組統計結果集的並集且未去掉重複資料。

四、group by後帶grouping sets子句

group by 後帶grouping sets子句效果就是只返回小記記錄,即只返回按單個列分組後的統計資料,不返回多個列組合分組的統計資料。

例1:group by  grouping sets(a )

產生的分組種數:1 種;

第一種:group by  a

例2:group by  grouping sets(a ,b)

產生的分組種數:2 種;

第一種:group by  a

第二種:group by  b

返回結果集:為以上兩種分組統計結果集的並集且未去掉重複資料。

例3:group by  grouping sets (a ,b,c)

產生的分組種數:3 種;

第一種:group by  a

第二種:group by  b

第三種:group by  c

返回結果集:為以上三種分組統計結果集的並集且未去掉重複資料。

group by後使用rollup子句總結

完後感覺也沒什麼的,很簡單的。下面按我的理解簡單總結一下 一 如何理解group by後帶rollup子句所產生的效果 group by後帶rollup子句的功能可以理解為 先按一定的規則產生多種分組,然後按各種分組統計資料 至於統計出的資料是求和還是最大值還是平均值等這就取決於select後的聚合...

datatable使用groupby進行分組統計

今天有同事問,如何在datatable中進行分組,並且計算分組後每組的數量,想了一下,可以使用linq來實現datatable分組。如下 效果區域 庫房 數量 北京 北京倉庫 1 北京 上海倉庫 1 上海 上海倉庫 2 datatable dt new datatable cart datacolu...

datatable使用groupby進行分組統計

如何在datatable中進行分組,並且計算分組後每組的數量,想了一下,可以使用linq來實現datatable分組。如下 效果區域 庫房 數量 北京 北京倉庫 1 北京 上海倉庫 1 上海 上海倉庫 2 datatable dt new datatable cart datacolumn dc1 ...