函数的意义
一旦成功地从表中检索出数据,就需要进一步操纵这些数据,以获得有用或有意义的结果。这些要求包括:执行计算与数学运算、转换数据、解析数值、组合值和聚合一个范围内的值等。
聚合函数
报表的典型用途是从全部数据中提取出代表一种趋势的值或者汇总值,这就是聚合的意义。
19~24岁之间的巴西男性在食品调味品上的平均支出是多少?
上季度所有订单中从订购到运输的最长时间是多少?
收发室里仍在工作的最老的员工是谁?
聚合函数应用特定的聚合操作并返回一个标量值(单一值)。返回的数据类型对应于该列或者传递到函数中的值。聚合经常和分组、累积以及透视等表运算一起使用,生成数据分析结果。第7章将详细介绍这个主题,这里仅讨论简单SELECT查询中的一些常用函数。
聚合函数不仅可用在SELECT查询中,还可以和标量输入值一起使用。那么,这样做的意义是什么呢?在下列代码中,将值15传递给下列聚合函数,每个函数的返回值都相同:
它们都返回15。虽然,对同一个值求平均、求和、求最小值、求最大值,所得的结果还是那个值。如果对一个值计数,又会产生什么结果呢?
SELECT COUNT(15)
得到的值是1,因为函数只计数了一个值。
现在做一些有意义的事。聚合函数只有在处理结果集合中的一组数据时才有意义。每个函数都处理某列的非空值。
AVG()函数
create table #GymEvent(Player varchar(10),[Subject] nvarchar(5),Scoredecimal(4,2))
go
insert into #GymEvent values('Sara','跳马',9.25)
insert into #GymEvent values('Cassie','跳马',8.75)
insert into #GymEvent values('Delaney','跳马',NULL)
insert into #GymEvent values('Sammi','跳马',8.05)
insert into #GymEvent values('Erika','跳马',8.60)
insert into #GymEvent values('Sara','平衡木',9.70)
insert into #GymEvent values('Cassie','平衡木',NULL)
insert into #GymEvent values('Delaney','平衡木',9.25)
insert into #GymEvent values('Sammi','平衡木',NULL)
insert into #GymEvent values('Erika','平衡木',8.85)
go
drop table #GymEvent
AVG()函数用于返回一组数值中所有非空数值的平均值。在这种情况下,计算平均值时只考虑实际的数值,NULL不参与运算,结果是8.921429。 但是,如果把缺少的成绩也算在内,即用数值0代替NULL,则会严重影响最终成绩(6.245)
COUNT()函数
COUNT()函数用于返回一个列内所有非空值的个数,这是一个整型值。比如,在上一个例子中,体操数据被保存在#GymEvent表中,要确定Sammi参加的项目数,则可以执行下列查询:
SELECT COUNT(Score) FROM #GymEvent WHERE Player=‘Sammi’
结果是1,因为Sammi只参加了跳马比赛,她的平衡木成绩是NULL。
如果需要确定表中的行数,无论这些行是不是NULL值,都可以使用以下语法:
SELECT COUNT (*) FROM #GymEvent
以Sammi为例,COUNT(*)查询如下所示:
SELECT COUNT(*) FROM #GymEvent WHERE Player=‘Sammi’
由于COUNT(*)函数会忽略NULL值,所以这个查询的结果是2。
MIN()与MAX()函数
MIN()函数用于返回一个列范围内的最小非空值;MAX()函数用于返回最大值。这两个函数可以用于大多数的数据类型,返回的值根据对不同数据类型的排序规则而定。为了说明这两个函数,假设有一个表包含了两列值,一列是整型值,另一列是字符型值,如表6-4所示。
create table #Temp(IntegerColumn int,VarCharColumn varchar(10))
go
insert into #Temp values(2,'2')
insert into #Temp values(4,'4')
insert into #Temp values(12,'12')
insert into #Temp values(19,'19')
go
drop table #Temp
如果分别调用MIN()与MAX()函数将会返回什么值呢?
select MIN(IntegerColumn),MAX(IntegerColumn) from #Temp
select MIN(VarCharColumn),MAX(VarCharColumn) from #Temp
因为VarCharColumn中值的存储类型为字符类型,而不是数字,所以结果以每个字符的ASCII值为顺序从左到右排序。这就是12比其他值小、而4比其他值大的原因。
SUM()函数
SUM()函数是最常用的聚合函数之一,它的功能很容易理解:和AVG()函数一样,它用于数值数据类型,返回一个列范围内所有非空值的总和。