相信很多朋友都經常會使用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
查詢結果:
可以看到,我們按safetystocklevel對產品進行了分類統計,顯示了符合條件(finishedgoodsflag=1)的統計結果。
然後我們加上all關鍵字
select safetystocklevel,count(productid) as productcount from Production.Product where finishedgoodsflag=1 group by
all safetystocklevel
查詢結果:
可以看到統計結果多出了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
查詢結果:
可以看到分別顯示了makeflag爲0或1,finishedgoodsflag爲0或1所產生的4種組合的統計結果。
然後加上with cube
select makeflag,finishedgoodsflag,count(productid) from Production.Product group by finishedgoodsflag,makeflag with cube
可以看到,出了原來的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
查詢結果
可以看到少了 0 NULL和 1 NULL的組合,也就是說,它只會考慮finishedgoodsflag(在group by中排在前面)的統計情形,以及全部記錄的計數,而不會單獨考慮makeflag的情形。