group by 后使用 rollup 子句總結
一、如何理解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
返回結果集:為以上三種分組統計結果集的並集且未去掉重復數據。