帶all、cube和rollup的Group By查詢

相信很多朋友都經常會使用Group By來進行數據的統計,本文介紹可能大家比較少用,但實際上有時候又很有用的三個Group By查詢。

1. group by all

SQL Server聯機叢書中是這樣描述group by all的:“只有在 SELECT 語句還包括 WHERE 子句時,ALL 關鍵字纔有意義。”也就是,group by all必須和where子句一起使用。

我們使用SQL Server 2005自帶的AdventureWorks數據庫的Production.Product表進行演示。

首先看不使用all關鍵字的情形:

select safetystocklevel,count(productid) as productcount from Production.Product where finishedgoodsflag=1 group by safetystocklevel
查詢結果:

帶all、cube和rollup的Group By查詢 - 瑞志.net - 山林客

可以看到,我們按safetystocklevel對產品進行了分類統計,顯示了符合條件(finishedgoodsflag=1)的統計結果。

然後我們加上all關鍵字

select safetystocklevel,count(productid) as productcount from Production.Product where finishedgoodsflag=1 group by all safetystocklevel
查詢結果:

帶all、cube和rollup的Group By查詢 - 瑞志.net - 山林客

可以看到統計結果多出了3行,並且這3行的productcount值都爲0。由此我們可以看到加上all關鍵字的作用,就是將不符合where子句的那部分數據也給顯示出來,也就是說顯示safetystocklevel的所有可能情況,對不符合finishedgoodsflag=1的則顯示爲0或者NULL。

2.group by ... with cube

group by ... with cube或with rollup只有在有兩個以上的分類字段的情況下才有用。

我們先看沒有with cube的情形:

select makeflag,finishedgoodsflag,count(productid) from Production.Product group by finishedgoodsflag,makeflag

查詢結果:

帶all、cube和rollup的Group By查詢 - 瑞志.net - 山林客

可以看到分別顯示了makeflag爲0或1,finishedgoodsflag爲0或1所產生的4種組合的統計結果。

然後加上with cube

select makeflag,finishedgoodsflag,count(productid) from Production.Product group by finishedgoodsflag,makeflag with cube
帶all、cube和rollup的Group By查詢 - 瑞志.net - 山林客

可以看到,出了原來的4組統計數據外,還多了幾行,我們逐行來看多出來的幾行:

NULL  0  209  ——統計finishedgoodsflag爲0的記錄數,不管makeflag,makeflag可以爲0或1,也就是182+27

NULL  1  259 ——統計finishedgoodsflag爲0的記錄數,不管makeflag,makeflag可以爲0或1,也就是83+212

NULL  NULL  504 ——不管finishedgoodsflag和makeflag的取值,也就是所有的記錄的總數

0  NULL  265 ——統計makeflag爲0的記錄數

1  NULL  239 ——統計makeflag爲1的記錄數

還有一個要注意的,就是查詢得出來的結果的排序,由於我們使用的是group by finishedgoodsflag,makeflag,所以它先統計完finishedgoodsflag,接着是全部記錄數,最後才統計makeflag。


 2.group by ... with rollup

 這個跟group by ... with cube的作用類似,只不過統計的情形會少一些,我們來看一下:

select makeflag,finishedgoodsflag,count(productid) from Production.Product group by finishedgoodsflag,makeflag with rollup

查詢結果

帶all、cube和rollup的Group By查詢 - 瑞志.net - 山林客
 可以看到少了 0 NULL和 1 NULL的組合,也就是說,它只會考慮finishedgoodsflag(在group by中排在前面)的統計情形,以及全部記錄的計數,而不會單獨考慮makeflag的情形。


發佈了28 篇原創文章 · 獲贊 12 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章