--本文为学习笔记,(《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