AVG (Transact-SQL)

返回组中各值的平均值。将忽略空值。后面可能跟随 OVER 子句。

主题链接图标Transact-SQL 语法约定

语法

AVG ( [ ALL | DISTINCT ] expression ) 

参数

  • ALL
    对所有的值进行聚合函数运算。ALL 是默认值。

  • DISTINCT
    指定 AVG 只在每个值的唯一实例上执行,而不管该值出现了多少次。

  • expression
    是精确数值或近似数值数据类别(bit 数据类型除外)的表达式。不允许使用聚合函数和子查询。

返回类型

返回类型由 expression 的计算结果类型确定。

表达式结果

返回类型

tinyint

int

smallint

int

int

int

bigint

bigint

decimal 类别 (p, s)

decimal(38, s) 除以decimal(10, 0)

money 和 smallmoney 类别

money

float 和 real 类别

float

注释

如果 expression 是别名数据类型,则返回类型也具有别名数据类型。但是,如果别名数据类型的基本数据类型得到提升(例如,从 tinyint 提升到 int),则返回值具有提升的数据类型,而非别名数据类型。

AVG () 可计算一组值的平均值,方法是用一组值的总和除以非空值的计数。如果值的总和超过返回值数据类型的最大值,将返回错误。

示例

A. 使用 SUM 和 AVG 函数进行计算

以下示例计算 Adventure Works Cycles 的副总所用的平均休假小时数以及总的病假小时数。对检索到的所有行,每个聚合函数都生成一个单独的汇总值。

USE AdventureWorks2008R2;
GO
SELECT AVG(VacationHours)AS 'Average vacation hours', 
    SUM  (SickLeaveHours) AS 'Total sick leave hours'
FROM HumanResources.Employee
WHERE JobTitle LIKE 'Vice President%';

下面是结果集:

Average vacation hours Total sick leave hours

---------------------- ----------------------

25 97

(1 row(s) affected)

B. 带 GROUP BY 子句使用 SUM 和 AVG 函数

当与 GROUP BY 子句一起使用时,每个聚合函数都针对每一组生成一个值,而不是针对整个表生成一个值。以下示例针对每个销售地区生成汇总值。汇总中列出每个地区的销售人员得到的平均奖金以及每个地区的本年度销售总额。

USE AdventureWorks2008R2;
GO
SELECT TerritoryID, AVG(Bonus)as 'Average bonus', SUM(SalesYTD) as 'YTD sales'
FROM Sales.SalesPerson
GROUP BY TerritoryID;
GO

C. 带 DISTINCT 使用 AVG

以下语句返回产品的平均标价。

USE AdventureWorks2008R2;
GO
SELECT AVG(DISTINCT ListPrice)
FROM Production.Product;

下面是结果集:

------------------------------

437.4042

(1 row(s) affected)

D. 不带 DISTINCT 使用 AVG

如果不使用 DISTINCT,AVG 函数将计算出 Product 表中所有产品的平均标价。

USE AdventureWorks2008R2;
GO
SELECT AVG(ListPrice)
FROM Production.Product;

下面是结果集:

------------------------------

438.6662

(1 row(s) affected)