AVG (Transact-SQL)
傳回群組中各個值的平均值。會忽略 Null 值。後面可能接著 OVER 子句。
語法
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 AdventureWorks;
GO
SELECT AVG(VacationHours)as 'Average vacation hours',
SUM (SickLeaveHours) as 'Total sick leave hours'
FROM HumanResources.Employee
WHERE Title LIKE 'Vice President%';
以下為結果集:
Average vacation hours Total sick leave hours
---------------------- ----------------------
25 97
(1 row(s) affected)
B. 搭配 GROUP BY 子句使用 SUM 和 AVG 函數
當搭配 GROUP BY 子句使用時,每個彙總函數都會產生每個群組的單一值,而不是整份資料表的單一值。下列範例會產生每個銷售領域的摘要值。摘要會列出每個領域的銷售人員所收到的平均獎金,及每個領域年初至今的銷售總和。
USE AdventureWorks;
GO
SELECT TerritoryID, AVG(Bonus)AS 'Average bonus', SUM(SalesYTD) AS 'YTD sales'
FROM Sales.SalesPerson
GROUP BY TerritoryID;
GO
C. 搭配 DISTINCT 使用 AVG
下列陳述式會傳回產品的平均標價。
USE AdventureWorks;
GO
SELECT AVG(DISTINCT ListPrice)
FROM Production.Product;
以下為結果集:
------------------------------
437.4042
(1 row(s) affected)
D. 使用不含 DISTINCT 的 AVG
當沒有 DISTINCT 時,AVG 函數會尋找 Product 資料表中所有產品的平均標價。
USE AdventureWorks;
GO
SELECT AVG(ListPrice)
FROM Production.Product;
以下為結果集:
------------------------------
438.6662
(1 row(s) affected)