在數(shù)據(jù)庫(kù)中 如何進(jìn)行分類分組并總計(jì)SQL信息
發(fā)布時(shí)間: 2006-11-23 09:23 作者: Builder.com.cn 信息來源: Builder.com.cn
您需要了解如何使用某些SQL子句和運(yùn)算符來安排SQL數(shù)據(jù),從而對(duì)它進(jìn)行高效分析。下面這些建議告訴您如何建立語(yǔ)句,獲得您希望的結(jié)果。 以有意義的方式安排數(shù)據(jù)可能是一種挑戰(zhàn)。有時(shí)您只需進(jìn)行簡(jiǎn)單分類。通常您必須進(jìn)行更多處理——進(jìn)行分組以利于分析與總計(jì)??上驳氖?,SQL提供了大量用于分類、分組和總計(jì)的子句及運(yùn)算符。下面的建議將有助于您了解何時(shí)進(jìn)行分類、何時(shí)分組、何時(shí)及如何進(jìn)行總計(jì)。欲了解每個(gè)子句和運(yùn)算符的詳細(xì)信息,請(qǐng)查看在線書籍。 #1:分類排序 通常,我們確實(shí)需要對(duì)所有數(shù)據(jù)進(jìn)行排序。SQL的ORDER BY子句將數(shù)據(jù)按字母或數(shù)字順序進(jìn)行排列。因此,同類數(shù)據(jù)明顯分類到各個(gè)組中。然而,這些組只是分類的結(jié)果,它們并不是真正的組。ORDER BY顯示每一個(gè)記錄,而一個(gè)組可能代表多個(gè)記錄。 #2:減少組中的相似數(shù)據(jù) 分類與分組的最大不同在于:分類數(shù)據(jù)顯示(任何限定標(biāo)準(zhǔn)內(nèi)的)所有記錄,而分組數(shù)據(jù)不顯示這些記錄。GROUP BY子句減少一個(gè)記錄中的相似數(shù)據(jù)。例如,GROUP BY能夠從重復(fù)那些值的源文件中返回一個(gè)唯一的郵政編碼列表: SELECT ZIP FROM Customers GROUP BY ZIP 僅包括那些在GROUP BY和SELECT列列表中字義組的列。換句話說,SELECT列表必須與GROUP列表相匹配。只有一種情況例外:SELECT列表能夠包含聚合函數(shù)。(而GROUP BY不支持聚合函數(shù)。) 記住,GROUP BY不會(huì)對(duì)作為結(jié)果產(chǎn)生的組分類。要對(duì)組按字母或數(shù)字順序排序,增加一個(gè)ORDER BY子句(#1)。另外,在GROUP BY子句中您不能引用一個(gè)有別名的域。組列必須在根本數(shù)據(jù)中,但它們不必出現(xiàn)在結(jié)果中。 #3:分組前限定數(shù)據(jù) 您可以增加一個(gè)WHERE子句限定由GROUP BY分組的數(shù)據(jù)。例如,下面的語(yǔ)句僅返回肯塔基地區(qū)顧客的郵政編碼列表。 SELECT ZIP FROM Customers WHERE State = ‘KY‘ GROUP BY ZIP 在GROUP BY子句求數(shù)據(jù)的值之前,WHERE對(duì)數(shù)據(jù)進(jìn)行過濾,記住這一點(diǎn)很重要。 和GROUP BY一樣,WHERE不支持聚合函數(shù)。 #4:返回所有組 當(dāng)您用WHERE過濾數(shù)據(jù)時(shí),得到的組只顯示那些您指定的記錄。符合組定義但不滿足子句條件的數(shù)據(jù)將不會(huì)出現(xiàn)在組中。不管WHERE條件如何,如果您想包括所有數(shù)據(jù),增加一個(gè)ALL子句。例如,在前面的語(yǔ)句中增加一個(gè)ALL子句會(huì)返回所有郵政編碼組,而不僅僅是肯塔基地區(qū)的組。 SELECT ZIP FROM Customers WHERE State = ‘KY‘ GROUP BY ALL ZIP 照這個(gè)樣子,這兩個(gè)子句會(huì)造成沖突,您可能不會(huì)以這種方式使用ALL子句。當(dāng)您用聚合求一個(gè)列的值時(shí),應(yīng)用ALL子句很方便。例如,下面的語(yǔ)句計(jì)算每個(gè)肯塔基郵政編碼的顧客數(shù)目,同時(shí)顯示其它郵政編碼值。 SELECT ZIP, Count(ZIP) AS KYCustomersByZIP FROM Customers WHERE State = ‘KY‘ GROUP BY ALL ZIP 得到的組由根本數(shù)據(jù)中的所有郵政編碼值構(gòu)成。但是,聚合列(KYCustomerByZIP)顯示為0,因?yàn)槌纤]政編碼組外沒有別的組。 遠(yuǎn)程查詢不支持GROUP BY ALL。 #5:分組后限定數(shù)據(jù) WHERE子句(#3)在GROUP BY子句之前求數(shù)據(jù)的值。當(dāng)您希望在分組以后限定數(shù)據(jù)時(shí),使用HAVING。通常,不管您使用WHERE還是HAVING,得到的結(jié)果相同。但要記住,這兩個(gè)子句不能互換,這點(diǎn)很重要。如果您存在疑問,這里有一條應(yīng)用指南:過濾記錄時(shí)使用WHERE;過濾組時(shí)使用HAVING。 一般,您會(huì)用HAVING,利用聚合來求一個(gè)組的值。例如,下面的語(yǔ)句返回一個(gè)郵政編碼列表,但這個(gè)表內(nèi)可能不包含根本數(shù)據(jù)源中的每個(gè)郵政編碼: SELECT ZIP, Count(ZIP) AS CustomersByZIP FROM Customers GROUP BY ZIP HAVING Count(ZIP) = 1 僅僅那些只有一名顧客的組出現(xiàn)在結(jié)果中。 #6:詳細(xì)了解WHERE和HAVING 如果您仍然對(duì)WHERE和HAVING的用法感到迷惑,應(yīng)用下面的指導(dǎo)方法: WHERE出現(xiàn)在GROUP BY之前;SQL在它分組記錄前求WHERE子句的值。 #7:用聚合總計(jì)分組值 分組數(shù)據(jù)有助于對(duì)數(shù)據(jù)進(jìn)行分析,但有時(shí)您還需要組本身以外的其它信息。您可以增加一個(gè)聚合函數(shù)來總計(jì)分組數(shù)據(jù)。例如,下面的語(yǔ)句為每次排序顯示一個(gè)小計(jì): SELECT OrderID, Sum(Cost * Quantity) AS OrderTotal FROM Orders GROUP BY OrderID 與其它的組一樣,SELECT和GROUP BY列表必須相匹配。在SELECT子句中包含一個(gè)聚合是這一規(guī)則的唯一例外。 #8:總計(jì)聚合 您可以通過顯示每個(gè)組的小計(jì)進(jìn)一步總計(jì)數(shù)據(jù)。SQL的ROLLUP運(yùn)算符為每個(gè)組顯示一個(gè)額外的記錄,一個(gè)小計(jì)。那個(gè)記錄是用聚合函數(shù)在每個(gè)組中求所有記錄的值的結(jié)果。下面的語(yǔ)句為每個(gè)組合計(jì)OrderTotal列。 SELECT Customer, OrderNumber, Sum(Cost * Quantity) AS OrderTotal FROM Orders GROUP BY Customer, OrderNumber WITH ROLLUP 一個(gè)包含20和25這兩個(gè)OrderTotal值的組的ROLLUP行將顯示OrderTotal值45。ROLLUP結(jié)果的第一個(gè)值是唯一的,因?yàn)樗笏薪M記錄的值。那個(gè)值是整個(gè)記錄集的總和。 ROLLUP不支持聚合函數(shù)中的DISTINCT或GROUP BY ALL子句。 #9:總計(jì)每一列 CUBE運(yùn)算符比ROLLUP更進(jìn)一步,它返回每個(gè)組中每個(gè)值的總數(shù)。得到的結(jié)果與ROLLUP相似,但CUBE包括組中每一列的一個(gè)額外記錄。下面的語(yǔ)句顯示每個(gè)組的小計(jì)和每名顧客的一個(gè)額外總數(shù)。 SELECT Customer, OrderNumber, Sum(Cost * Quantity) AS OrderTotal FROM Orders GROUP BY Customer, OrderNumber WITH CUBE 用CUBE得到的總計(jì)最為復(fù)雜。不僅完成聚合與ROLLUP的工作,而且還求定義組的其它列的值。也就是說,CUBE總計(jì)每一個(gè)可能的列組合。 CUBE不支持GROUP BY ALL。 #10:給總計(jì)排序 當(dāng)CUBE的結(jié)果雜亂無章時(shí)(一般都是這樣),可以增加一個(gè)GROUPING函數(shù),如下所示: SELECT GROUPING(Customer), OrderNumber, Sum(Cost * Quantity) AS OrderTotal FROM Orders GROUP BY Customer, OrderNumber WITH CUBE 其結(jié)果包括每一行的兩個(gè)額外的值。 值1表明左邊的值是一個(gè)總計(jì)值——ROLLUP或CUBE的運(yùn)算符的結(jié)果。 |
|