T-SQL集合函數

--本文爲學習筆記,(《t_sql》作者:Robert Sheldon 譯者:馮昀暉 來源:TT中國)

T-SQL集合函數

基礎知識 

--在SQL Server 2008中,Transact-SQL有一些集合函數,這些函數支持你執行這類計算。一個T-SQL集合函數返回一個值,可以被作爲一個表達式用在SELECT查詢列表或者“COMPUTE”,“COMPUTE BY”或者“HAVING”從句中。所有集合函數都忽略“null”值,除了“COUNT”函數。 

select territord_id,avg(subtotal) as avgsales,sum(subtotal) as toatalsales from sales.salesorderheader group by territory_id order by territory_id

--該例按“Territory ID”列對值進行分組,然後對產生的每個分組求一次平均值以及計算基於“SubTotal ”列求出來的銷售總量

--另外兩個集合函數:“MAX”函數和“MIN”函數。“MAX”函數返回一組值中的最大值,而“MIN”函數返回最小值。這兩個函數都會忽略“null”值。當處理字符數據時,最大值和最小值是基於列的自然順序計算的。當然,也可以對字符和日期數據使用“MAX”函數和“MIN”函數。例如:“name”列被指定爲“nvarchar”數據類型。當我對該列使用“MAX”函數或者“MIN”函數時,返回的最大值和最小值是基於該列名稱的字母順序計算的,對日期時間列使用“MIN”函數或者“MAX”函數,返回的值會基於保存在該列中日期時間值的最早值或者最晚值進行計算。 


計算行數

“COUNT”函數返回一組值的數量。與其他集合函數不同,你可以在計數時指定是否包括“null”值。此外,你可以指定是計算所有值,還是隻計算不同的值

select count(*) as productcount,--集合的行數,包含null值

count(productmodelid) as modelcouont,--列productmodelid的行數,不包含null值

count(discinct productmodelid) as distinctcount --列productmodelid不重複的行數,非null值

from production.product

--注意:大部分集合函數支持“DISTINCT”關鍵字,所以你可以指定集合函數只在指定組中不重複的數據中執行。詳細信息請參考SQL Server聯機叢書中關於如何在各個函數中使用“DISTINCT”的內容。 

--“COUNT”函數返回“int”類型值,“COUNT_BIG”返回“bigint”值。 


操作分組數據

--在T-SQL語句中使用“GROUP BY”從句時,你可以使用“ROLLUP”,“CUBE”或者“GOURPING SETS”操作符來指定包含在結果集中的附加統計數據。這部分彙總數據在“GROUP BY”列表中表示爲“null”值。 這是“null”值的一種特殊用法。

--然而,在“GROUP BY”列中指定的該列可以包含“null”值,(這種情況下)在該列的結果中也會顯示爲“null”。

--要區分這兩種類型的“null”值,可以使用SQL Server提供的“GROUPING”集合函數。該函數可以明確指定“GROUP BY”從句中指定的列是否參與集合計算。 如果結果集中的值參與集合運算了,則“GROUPING”函數返回值“1”。否則,該函數返回值爲“0”

select color,

avg(listprice) as avgprice,count(*) as totalamount,

grouping(color) as agggroup --“GROUPING”函數常常用來指明在某列中顯示的值是否是一個分組值,還是參與集合運算的累積值

from producttion.product group by color with rollup

--“GROUP BY”從句帶有“WITH ROLLUP”操作符。因爲“Color”是“GROUP BY”從句中指定的列,所以該列可以被用在“SELECT”列表的“GROUPING”函數中。 

--“GROUPING”函數只能被用在“SELECT”列表,“HAVING”從句或者“ORDER BY”從句中。 

驗證總和校驗

--SQL Server還提供了“CHECKSUM_AGG”函數,該函數支持對一組數值運行總和校驗。這在檢測某個表數據的變化時很方便。然而,要注意的是該總和校驗只能被用在整數表達式上,在執行計算時會忽略“null”值。 

select checksum_agg(cast(quantity as int)) as checksumagg,--返回262

checksum_agg(distinct cast(quantity as int)) as checksumdistinct --返回78

from production.productinventory 

--因爲表productinventory 的quantity列 配置的數據類型爲smallint,所以在運行總和校驗之前,必須把它轉換成int 的數據類型。

獲取統計數據

SQL Server有四個集合函數可以支持你對數值型列的一組值做數據統計: 

STDEV:返回值的統計標準方差。 

STDEVP:返回總體值的統計標準方差。 

VAR:返回值的統計方差。 

VARP:返回總體值的統計方差。 

--上面每個函數都會忽略“null”值,返回值都是浮點類型值。返回值表示該組值偏離平均值的程度(標準方差是方差的平方根)。抱歉的是,我不是專業學統計的,所以你要想了解更多關於如何計算標準方差和方差(以及統計羣體與那些計算有多契合)的詳細知識,那得去找本統計學方面的書好好查查了。與此同時,下面的語句展示了這些函數的用法: select stdev(listprice) as stdevprice,stdevp(listprice) as stdevpprice,var(listprice) as varprice,varp(listprice) as varpprice from production.product



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