AVG (Transact-SQL)

傳回群組中各個值的平均值。會忽略 Null 值。後面可能接著 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 () 會計算一組值的平均值,其方式是將這些值的總和除以非 null 值的計數。如果總和超過傳回值之資料類型的最大值,便會傳回錯誤。

範例

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)