1.使用排序使數(shù)據(jù)有序
通常,你的所有數(shù)據(jù)真正需要的僅僅是按某種順序排列。SQL的ORDER BY語(yǔ)句可以以字母或數(shù)字順序組織數(shù)據(jù)。因此,相似的值按組排序在一起。然而,這個(gè)分組時(shí)排序的結(jié)果,并不是真的分組。ORDER BY顯示每條記錄而分組可能代表很多記錄。
2.進(jìn)行分組除去重復(fù)值
排序和分組之間的最大區(qū)別是:排序的數(shù)據(jù)顯示所有記錄(在限定標(biāo)準(zhǔn)范圍之內(nèi)),而分組數(shù)據(jù)不是顯示所有記錄。GROUP BY語(yǔ)句對(duì)于同樣的值只顯示一條記錄。例如,下面的語(yǔ)句中的GROUP BY語(yǔ)句對(duì)數(shù)據(jù)源中重復(fù)出現(xiàn)的數(shù)據(jù)只返回唯一的zip編碼列。
復(fù)制代碼 代碼如下:
SELECT ZIP FROM Customers GROUP BY ZIP
只包括由GROUP BY和SELECT語(yǔ)句共同定義的那些記錄,換句話說(shuō),SELECT列表必須滿足GROUP BY列表,但是有一個(gè)例外就是SELECT列表可以包含聚合函數(shù)(GROUP BY語(yǔ)句不允許使用聚合函數(shù))。需要注意的是GROUP BY語(yǔ)句不會(huì)對(duì)結(jié)果分組進(jìn)行排序。為了使分組按字母或數(shù)字有序排列,需要添加ORDER BY語(yǔ)句。此外,在GROUP BY語(yǔ)句中不能引用使用了別名的字段。分組欄目必須是潛在的數(shù)據(jù),但它們并不需要顯示在結(jié)果中。
3.在分組之前進(jìn)行數(shù)據(jù)篩選
你可以添加一個(gè)WHERE語(yǔ)句來(lái)篩選有GROUP BY所得分組中的數(shù)據(jù)。例如,下面的語(yǔ)句只返回肯塔基州顧客的唯一ZIP編碼列。
復(fù)制代碼 代碼如下:
SELECT ZIP FROM Customers WHERE State = 'KY' GROUP BY ZIP
必須注意的是WHERE語(yǔ)句是在GROUP BY語(yǔ)句求值之前進(jìn)行數(shù)據(jù)過(guò)濾的。與GROUP BY語(yǔ)句一樣,WHERE語(yǔ)句也不支持聚合函數(shù)。
4.返回所有分組
當(dāng)你使用WHERE語(yǔ)句過(guò)濾數(shù)據(jù)時(shí),結(jié)果分組中只顯示你指定的那些記錄,而符合分組定義但是不滿足過(guò)濾條件的數(shù)據(jù)不會(huì)包含在某個(gè)分組中。當(dāng)你想在分 組中包含所有數(shù)據(jù)時(shí)添加關(guān)鍵字ALL即可,這時(shí)WHERE條件就不起作用。例如,在前面的例子中添加關(guān)鍵字ALL就會(huì)返回所有的ZIP分組,而不是僅在肯 塔基州的那些。
復(fù)制代碼 代碼如下:
SELECT ZIP FROM Customers WHERE State = 'KY' GROUP BY ALL ZIP
這樣看來(lái),這兩個(gè)語(yǔ)句存在沖突,你可能不會(huì)以這種方式使用關(guān)鍵字ALL。當(dāng)你使用聚合函數(shù)計(jì)算某一列時(shí),使用ALL關(guān)鍵字可能會(huì)很方便。例如,下面的語(yǔ)句計(jì)算每個(gè)肯塔基州ZIP中的顧客數(shù),同時(shí),還會(huì)顯示其它的ZIP值。
復(fù)制代碼 代碼如下:
SELECT ZIP, Count(ZIP) AS KYCustomersByZIP FROM Customers WHERE State = 'KY' GROUP BY ALL ZIP
結(jié)果分組包括潛在數(shù)據(jù)中的所有ZIP值,然而,對(duì)于那些不是肯塔基州ZIP分組的聚合列(KYCustomersByZIP)將會(huì)顯示0。遠(yuǎn)程查詢不支持GROUP BY ALL。
5.分組后篩選數(shù)據(jù)
WHERE語(yǔ)句在GROUP BY語(yǔ)句之前進(jìn)行計(jì)算。當(dāng)你需要在分組之后篩選數(shù)據(jù)時(shí),可以使用HAVING語(yǔ)句。通常情況下,WHERE語(yǔ)句和HAVING語(yǔ)句的返回結(jié)果是一樣的,但 是值得注意的是這兩個(gè)語(yǔ)句不可互換。當(dāng)你迷惑時(shí),可以遵循下面的說(shuō)明:使用WHERE語(yǔ)句過(guò)濾記錄,使用HAVING語(yǔ)句過(guò)濾分組。
一般情況,你會(huì)使用HAVING語(yǔ)句和某個(gè)聚合函數(shù)計(jì)算一個(gè)分組。例如,下面的語(yǔ)句返回一個(gè)唯一的ZIP編碼列,但是可能不會(huì)包含潛在數(shù)據(jù)源中所有的ZIP。
復(fù)制代碼 代碼如下:
SELECT ZIP, Count(ZIP) AS Customers FROM Customers GROUP BY ZIP HAVING Count(ZIP) = 1
只有那些包含一位顧客的分組顯示在結(jié)果中。
6.進(jìn)一步了解WHERE和HAVING語(yǔ)句
如果你對(duì)何時(shí)應(yīng)該使用WHERE,何時(shí)使用HAVING仍舊很迷惑,請(qǐng)遵照下面的說(shuō)明:
WHERE語(yǔ)句在GROUP BY語(yǔ)句之前;SQL會(huì)在分組之前計(jì)算WHERE語(yǔ)句。
HAVING語(yǔ)句在GROUP BY語(yǔ)句之后;SQL會(huì)在分組之后計(jì)算HAVING語(yǔ)句。
7.使用聚合函數(shù)統(tǒng)計(jì)分組數(shù)據(jù)
分組數(shù)據(jù)可以幫助我們分析數(shù)據(jù),但是有時(shí)我們可能需要更多的信息而不僅僅是分組。你可以使用聚合函數(shù)來(lái)統(tǒng)計(jì)分組數(shù)據(jù)。例如,下面的語(yǔ)句顯示每批訂購(gòu)單的總價(jià)錢(qián)。
復(fù)制代碼 代碼如下:
SELECT OrderID, Sum(Cost * Quantity) AS OrderTotal FROM Orders GROUP BY OrderID
對(duì)于其它的分組來(lái)說(shuō),SELECT和GROUP?。拢倭斜仨毱ヅ?。而SELECT語(yǔ)句包含聚合函數(shù)時(shí)這一規(guī)則是一個(gè)例外.
8.統(tǒng)計(jì)聚合數(shù)據(jù)
你可以繼續(xù)統(tǒng)計(jì)數(shù)據(jù)為每個(gè)分組顯示一個(gè)分類(lèi)統(tǒng)計(jì)。SQL的ROLLUP操作符可以為每個(gè)分組顯示一個(gè)額外的分類(lèi)統(tǒng)計(jì)。這個(gè)分類(lèi)統(tǒng)計(jì)是使用聚合函數(shù)計(jì)算每個(gè)分組中的所有記錄得到的結(jié)果。下面的語(yǔ)句為每個(gè)分組計(jì)算OrderTotal:
復(fù)制代碼 代碼如下:
SELECT Customer, OrderNumber, Sum(Cost * Quantity) AS OrderTotal FROM Orders GROUP BY Customer, OrderNumber WITH ROLLUP
對(duì)于有兩個(gè)分別為20和25 OderTotal值的分組,ROLLUP顯示一個(gè)OrderTotal值45。ROLLUP結(jié)果中的第一條記錄是唯一的,因?yàn)樗怯?jì)算所有分組記錄,這個(gè)值是整個(gè)記錄集的總值。
ROLLUP在聚合函數(shù)中不支持 DISTINCT,也不支持GROUP BY ALL語(yǔ)句。
9.統(tǒng)計(jì)每個(gè)列
CUBE操作符比ROLLUP更進(jìn)一步,它返回每個(gè)分組中重復(fù)值的個(gè)數(shù)。它的結(jié)果和ROLLUP相同,但是對(duì)每位客戶的每一列CUBE包含一個(gè)額外的記錄。下面的語(yǔ)句顯示每個(gè)分組的統(tǒng)計(jì)和額外每位客戶的統(tǒng)計(jì)。
復(fù)制代碼 代碼如下:
SELECT Customer, OrderNumber, Sum(Cost * Quantity) AS OrderTotal FROM Orders GROUP BY Customer, OrderNumber WITH CUBE
CUBE可以給最綜合的統(tǒng)計(jì)。它不僅完成聚合和ROLLUP的功能,還可以計(jì)算定義分組的其它列,換句話說(shuō),CUBE統(tǒng)計(jì)每個(gè)可能的列組合。
CUBE不支持GROUP BY ALL語(yǔ)句。
10:對(duì)統(tǒng)計(jì)結(jié)果排序
當(dāng)CUBE的結(jié)果令人迷惑時(shí)(它經(jīng)常是這樣),可以添加一個(gè)GROUPING函數(shù),如下所示:
復(fù)制代碼 代碼如下:
SELECT GROUPING(Customer), OrderNumber, Sum(Cost * Quantity) AS OrderTotal FROM Orders GROUP BY Customer, OrderNumber WITH CUBE
結(jié)果中每行包含兩個(gè)額外的值:
值1表示左邊的值是一個(gè)統(tǒng)計(jì)值,是ROLLUP或CUBE的操作符。
值0表示左邊的值是一條由最初的GROUP BY語(yǔ)句產(chǎn)生的詳細(xì)記錄。
您可能感興趣的文章:- sql分組后二次匯總(處理表重復(fù)記錄查詢和刪除)的實(shí)現(xiàn)方法
- SQL SERVER 分組求和sql語(yǔ)句
- 顯示同一分組中的其他元素的sql語(yǔ)句
- sql獲取分組排序后數(shù)據(jù)的腳本
- SQL分組排序去重復(fù)的小實(shí)例
- 以數(shù)據(jù)庫(kù)字段分組顯示數(shù)據(jù)的sql語(yǔ)句(詳細(xì)介紹)
- SQL中Group分組獲取Top N方法實(shí)現(xiàn)可首選row_number
- Sql Server:多行合并成一行,并做分組統(tǒng)計(jì)的兩個(gè)方法
- Sql Server 分組統(tǒng)計(jì)并合計(jì)總數(shù)及WITH ROLLUP應(yīng)用
- SQL語(yǔ)句分組獲取記錄的第一條數(shù)據(jù)的方法
- sqlserver巧用row_number和partition by分組取top數(shù)據(jù)
- 一句Sql把縱向表轉(zhuǎn)為橫向表,并分別分組求平均和總平均值
- sql 分組查詢問(wèn)題
- SQLserver 實(shí)現(xiàn)分組統(tǒng)計(jì)查詢(按月、小時(shí)分組)
- 分組后分組合計(jì)以及總計(jì)SQL語(yǔ)句(稍微整理了一下)