Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a:SQL Server
Base de Dados SQL do Azure
Instância Gerida do Azure SQL
Azure Synapse Analytics
Sistema de Plataforma de Análise (PDW)
Ponto de Extremidade de Análise SQL no Microsoft Fabric
Armazém no Microsoft Fabric
Base de Dados SQL no Microsoft Fabric
Esta função devolve a média dos valores num grupo. Ignora valores nulos.
Transact-SQL convenções de sintaxe
Sintaxe
AVG ( [ ALL | DISTINCT ] expression )
[ OVER ( [ partition_by_clause ] order_by_clause ) ]
Arguments
ALL
Aplica a função de agregação a todos os valores. ALL é o padrão.
DISTINTO
Especifica que o AVG opera apenas numa única instância de cada valor, independentemente de quantas vezes esse valor ocorra.
expressão
Uma expressão do tipo de dado numérico exato ou numérico aproximado, exceto para o tipo de dado bit . Funções agregadas e subconsultas não são permitidas.
TERMINADO ( [ partition_by_clause ] order_by_clause)
partition_by_clause divide o conjunto de resultados produzido pela cláusula FROM em partições às quais a função é aplicada. Se não for especificada, a função trata todas as linhas do conjunto de resultados da consulta como um único grupo. O order_by_clause determina a ordem lógica em que a operação é realizada. O order_by_clause é obrigatório. Para mais informações, consulte a Cláusula OVER (Transact-SQL).
Tipos de devolução
O resultado avaliado da expressão determina o tipo de retorno.
| Resultado da expressão | Tipo de retorno |
|---|---|
| tinyint | int |
| smallint | int |
| int | int |
| bigint | bigint |
| Categoria decimal (P, S) | Decimal(38, max(s,6)) |
| Moeda e categoria de dinheiro pequeno | dinheiro |
| Flutuante e categoria real | float |
Observações
Se o tipo de dado da expressão for um tipo de dado alias, o tipo de retorno também é do tipo de dado alias. No entanto, se o tipo base do tipo de dados alias for promovido, por exemplo de tinyint para int, o valor de retorno assume o tipo de dado promovido, e não o tipo de alias.
A AVG () calcula a média de um conjunto de valores dividindo a soma desses valores pela contagem de valores não nulos. Se a soma exceder o valor máximo para o tipo de dado do valor de retorno, o AVG() devolve um erro.
A AVG é uma função determinística quando usada sem as cláusulas OVER e ORDER BY. É não determinístico quando especificado com as cláusulas OVER e ORDER BY. Para mais informações, consulte Funções Determinísticas e Não Determinísticas. Além disso, o AVG pode parecer comportar-se como uma função não determinística quando se usa com tipos de dados float e reais . Mas a razão subjacente é a natureza aproximada destes tipos de dados.
Examples
A. Utilização das funções SUM e AVG para cálculos
Este exemplo calcula as horas médias de férias, e a soma das horas de baixa médica, que os vice-presidentes da Adventure Works Cycles utilizaram. Cada uma destas funções agregadas produz um único valor de resumo para todas as linhas recuperadas. O exemplo utiliza a base de dados AdventureWorks2025.
SELECT AVG(VacationHours)AS 'Average vacation hours',
SUM(SickLeaveHours) AS 'Total sick leave hours'
FROM HumanResources.Employee
WHERE JobTitle LIKE 'Vice President%';
Aqui está o conjunto de resultados.
Average vacation hours Total sick leave hours
---------------------- ----------------------
25 97
(1 row(s) affected)
B. Usar as funções SUM e AVG com uma cláusula GROUP BY
Quando usada com uma GROUP BY cláusula, cada função agregada produz um único valor que cobre cada grupo, em vez de um único valor que cobre toda a tabela. O exemplo seguinte produz valores resumo para cada território de vendas na base de dados AdventureWorks2025. O resumo lista o bónus médio recebido pelos vendedores em cada território e a soma das vendas acumuladas no ano para cada território.
SELECT TerritoryID, AVG(Bonus)as 'Average bonus', SUM(SalesYTD) as 'YTD sales'
FROM Sales.SalesPerson
GROUP BY TerritoryID;
GO
Aqui está o conjunto de resultados.
TerritoryID Average Bonus YTD Sales
----------- --------------------- ---------------------
NULL 0.00 1252127.9471
1 4133.3333 4502152.2674
2 4100.00 3763178.1787
3 2500.00 3189418.3662
4 2775.00 6709904.1666
5 6700.00 2315185.611
6 2750.00 4058260.1825
7 985.00 3121616.3202
8 75.00 1827066.7118
9 5650.00 1421810.9242
10 5150.00 4116871.2277
(11 row(s) affected)
C. Usar AVG com DISTINCT
Esta declaração devolve o preço médio de lista dos produtos na base de dados AdventureWorks2025. Ao usar DISTINCT, o cálculo considera apenas valores únicos.
SELECT AVG(DISTINCT ListPrice)
FROM Production.Product;
Aqui está o conjunto de resultados.
------------------------------
437.4042
(1 row(s) affected)
D. Usar o AVG sem o DISTINCT
Sem o DISTINCT, a AVG função encontra o preço médio de lista de todos os Product produtos na tabela da base de dados AdventureWorks2025, incluindo quaisquer valores duplicados.
SELECT AVG(ListPrice)
FROM Production.Product;
Aqui está o conjunto de resultados.
------------------------------
438.6662
(1 row(s) affected)
E. Utilização da cláusula OVER
O exemplo seguinte utiliza a função AVG com a cláusula OVER, para fornecer uma média móvel das vendas anuais para cada território na Sales.SalesPerson tabela da base de dados AdventureWorks2025. Os dados são particionados por TerritoryID e ordenados logicamente por SalesYTD. Isto significa que a função AVG é calculada para cada território com base no ano de vendas. Para TerritoryID o 1, existem duas filas para o ano de vendas de 2005, que representam os dois vendedores com vendas desse ano. As vendas médias destas duas linhas são calculadas, e depois a terceira linha que representa as vendas do ano de 2006 é incluída no cálculo.
SELECT BusinessEntityID, TerritoryID
,DATEPART(yy,ModifiedDate) AS SalesYear
,CONVERT(VARCHAR(20),SalesYTD,1) AS SalesYTD
,CONVERT(VARCHAR(20),AVG(SalesYTD) OVER (PARTITION BY TerritoryID
ORDER BY DATEPART(yy,ModifiedDate)
),1) AS MovingAvg
,CONVERT(VARCHAR(20),SUM(SalesYTD) OVER (PARTITION BY TerritoryID
ORDER BY DATEPART(yy,ModifiedDate)
),1) AS CumulativeTotal
FROM Sales.SalesPerson
WHERE TerritoryID IS NULL OR TerritoryID < 5
ORDER BY TerritoryID,SalesYear;
Aqui está o conjunto de resultados.
BusinessEntityID TerritoryID SalesYear SalesYTD MovingAvg CumulativeTotal
---------------- ----------- ----------- -------------------- -------------------- --------------------
274 NULL 2005 559,697.56 559,697.56 559,697.56
287 NULL 2006 519,905.93 539,801.75 1,079,603.50
285 NULL 2007 172,524.45 417,375.98 1,252,127.95
283 1 2005 1,573,012.94 1,462,795.04 2,925,590.07
280 1 2005 1,352,577.13 1,462,795.04 2,925,590.07
284 1 2006 1,576,562.20 1,500,717.42 4,502,152.27
275 2 2005 3,763,178.18 3,763,178.18 3,763,178.18
277 3 2005 3,189,418.37 3,189,418.37 3,189,418.37
276 4 2005 4,251,368.55 3,354,952.08 6,709,904.17
281 4 2005 2,458,535.62 3,354,952.08 6,709,904.17
(10 row(s) affected)
Neste exemplo, a cláusula OVER não inclui PARTITION BY. Isto significa que a função aplica-se a todas as linhas devolvidas pela consulta. A cláusula ORDER BY especificada na cláusula OVER determina a ordem lógica à qual a função AVG se aplica. A consulta devolve uma média móvel das vendas, por ano, para todos os territórios de vendas especificados na cláusula WHERE. A cláusula ORDER BY especificada na instrução SELECT determina a ordem em que a instrução SELECT apresenta as linhas da consulta.
SELECT BusinessEntityID, TerritoryID
,DATEPART(yy,ModifiedDate) AS SalesYear
,CONVERT(VARCHAR(20),SalesYTD,1) AS SalesYTD
,CONVERT(VARCHAR(20),AVG(SalesYTD) OVER (ORDER BY DATEPART(yy,ModifiedDate)
),1) AS MovingAvg
,CONVERT(VARCHAR(20),SUM(SalesYTD) OVER (ORDER BY DATEPART(yy,ModifiedDate)
),1) AS CumulativeTotal
FROM Sales.SalesPerson
WHERE TerritoryID IS NULL OR TerritoryID < 5
ORDER BY SalesYear;
Aqui está o conjunto de resultados.
BusinessEntityID TerritoryID SalesYear SalesYTD MovingAvg CumulativeTotal
---------------- ----------- ----------- -------------------- -------------------- --------------------
274 NULL 2005 559,697.56 2,449,684.05 17,147,788.35
275 2 2005 3,763,178.18 2,449,684.05 17,147,788.35
276 4 2005 4,251,368.55 2,449,684.05 17,147,788.35
277 3 2005 3,189,418.37 2,449,684.05 17,147,788.35
280 1 2005 1,352,577.13 2,449,684.05 17,147,788.35
281 4 2005 2,458,535.62 2,449,684.05 17,147,788.35
283 1 2005 1,573,012.94 2,449,684.05 17,147,788.35
284 1 2006 1,576,562.20 2,138,250.72 19,244,256.47
287 NULL 2006 519,905.93 2,138,250.72 19,244,256.47
285 NULL 2007 172,524.45 1,941,678.09 19,416,780.93
(10 row(s) affected)