group by 高級用法超詳細總結

group by 作爲一種分組查詢,在sql中用處十分廣泛。其中的簡單用法,這裏不再進行贅述,這篇文章,主要是研究 group by 的 rollup ,cube以及grouping sets

測試的表如下圖所示


group by rollup 

首先解釋一下 rollup的中文意思爲:歸納,彙總的意思。
執行這個語句      select sum(toba_num),cust_code,toba_code fromgroupbytest group by rollup (cust_code,toba_code)
得到的結果如下圖所示


理解:先按照一定的規則產生多種分組,然後按照各組統計數據

按上述例子來說:

有三種分組

1:group by null,即,只統計數據,沒有進行分組

2:group by cust_code,即,只按照cust_code進行分組

3:group by cust_code,toba_code,相當於沒寫rollup

最終的結果爲:三種結果的並集

分組的規律:

分組的種類數爲:rollup後面的字段數 + 1

Group by rollup(A,B,C,D....)

1.group by null

2.group by A

3.group by A,B

4.group by A,B,C

5.group by A,B,C,D

6. ....

每一種分組的個數爲:group by 後面字段在 【所查詢數據】的種類數

 

以上述例子來說:

所查詢數據爲:

select sum(toba_num),cust_code,toba_code fromgroupbytest

 

第一種分組的個數:永遠是一個

第二種分組的個數:cust_code在【所查詢數據】的種類數爲2

第三種分組的個數:(cust_code,toba_code)在【所查詢數據】的種類數爲6

所以一共有九個數據。


group by cube

Cube:多維數據集。然後執行下面的sql語句

select sum(toba_num),cust_code,toba_code fromgroupbytest group by cube (cust_code,toba_code)

得到的結果,如下圖所示


理解:先按照一定的規則產生多種分組,然後按照各組統計數據

按上述例子來說:

有四種分組

1:group by null,即,只統計數據,沒有進行分組

2:group by cust_code,即,只按照cust_code進行分組

3:group by toba_code,即,只按照toba_code進行分組

4:group by cust_code,toba_code,相當於沒寫cube

最終的結果爲:四種結果的並集

分組的種類數爲: 


n爲:cube括號裏面的字段數

如:Group by rollup(A,B,C),首先會產生8個分組,分別爲:

1.group by null,即,只統計數據,沒有進行分組

2.group by A,即,只按照A進行分組

3.group by B,即,只按照B進行分組

4.group by C,即,只按照C進行分組

5.group by A,C,即,按照A,C進行分組

6.group by A,B,即,按照A,B進行分組

7.group by B,C,即,按照B,C進行分組

8.group by A,B,C,即,相當於沒寫cube

 

每一種分組的個數爲:跟rollup相同


group by grouping sets

Grouping sets:分組設置/集。然後執行下面的sql語句

select sum(toba_num),cust_code,toba_code fromgroupbytest group by grouping sets(cust_code,toba_code)

結果如下圖所示


理解:先按照一定的規則產生多種分組,然後按照各組統計數據

按上述例子來說:

有兩種分組

1:group by cust_code,即,只按照cust_code進行分組

2:group by toba_code,即,只按照toba_code進行分組

最終的結果爲:兩種結果的並集

分組的規律:

分組的種類數爲:grouping sets括號裏面的字段數

Group by grouping sets(A,B,C,D....)

1.group by A

2.group by B

3.group by C

4.group by D

5. ....

每一組分組的種類數爲:同rollup

特別注意

不管是 rollup,還是cube,還是grouping sets,以rollup 舉例:
group by rollup((A,B),C,D),這種情況下A,B是一個整體,具體是什麼意思,請大家自己動手實驗一下,自己理解一下,畢竟紙上得來終覺淺。。。。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章