AVG (Transact-SQL)

S’applique à : SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) SQL analytics endpoint in Microsoft Fabric Warehouse in Microsoft Fabric

Cette fonction retourne la moyenne des valeurs dans un groupe. Elle ignore les valeurs null.

Conventions de la syntaxe Transact-SQL

Syntaxe

AVG ( [ ALL | DISTINCT ] expression )
   [ OVER ( [ partition_by_clause ] order_by_clause ) ]

Arguments

ALL

Applique la fonction d'agrégation à toutes les valeurs. ALL est l'argument par défaut.

DISTINCT

Spécifie que la fonction AVG est appliquée à une seule instance de chaque valeur, quel que soit le nombre d'occurrences de la valeur.

expression

Expression de la catégorie de type de données numérique exacte ou approximative, à l’exception du type de données bit. Les fonctions d’agrégation et les sous-requêtes ne sont pas autorisées.

OVER ( [ partition_by_clause ] order_by_clause )

partition_by_clause divise le jeu de résultats généré par la clause FROM en partitions auxquelles la fonction est appliquée. S'il n'est pas spécifié, la fonction gère toutes les lignes du jeu de résultats de la requête en un seul groupe. order_by_clause détermine l’ordre logique dans lequel l’opération est effectuée. order_by_clause est requis. Pour plus d’informations, consultez Clause OVER (Transact-SQL).

Types de retour

Le résultat évalué de l’expression détermine le type de retour.

Résultat de l'expression Type de retour
tinyint int
smallint int
int int
bigint bigint
Catégorie decimal (p, s) decimal(38, max(s,6))
Catégorie money et smallmoney money
Catégorie float et real float

Remarques

Si le type de données d’expression est un type de données alias, le type de retour est également du type de données alias. Toutefois, si le type de données de base du type de données alias est promu, par exemple de tinyint à int, la valeur de retour prend le type de données promu et non le type de données alias.

AVG () calcule la moyenne d’un ensemble de valeurs en divisant la somme de ces valeurs par le nombre de valeurs non null. Si la somme dépasse la valeur maximale pour le type de données de la valeur de retour, AVG() retourne une erreur.

AVG est une fonction déterministe lorsqu'elle est utilisée sans les clauses OVER et ORDER BY. Il n’est pas déterministe lorsqu’il est spécifié avec les clauses OVER et ORDER BY. Pour plus d’informations, consultez Fonctions déterministes et non déterministes. En outre, AVG peut sembler se comporter comme une fonction non déterministe lorsque vous l’utilisez avec des types de données float et réels . Mais la raison sous-jacente est la nature approximative de ces types de données.

Exemples

R. Utilisation des fonctions SUM et AVG pour des calculs

Cet exemple calcule la moyenne des heures de congés, ainsi que la somme des heures de congés maladie utilisées par les vice-présidents d'Adventure Works Cycles. Chacune de ces fonctions d'agrégation produit une valeur de résumé unique pour toutes les lignes récupérées. L’exemple utilise la base de données AdventureWorks2022.

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

Voici le jeu de résultats.

Average vacation hours       Total sick leave hours
 ----------------------       ----------------------
25                           97

(1 row(s) affected)

B. Utilisation des fonctions SUM et AVG avec une clause GROUP BY

Lorsqu'elle est utilisée avec une clause GROUP BY, chaque fonction d'agrégation produit une valeur unique couvrant chaque groupe, au lieu d’une valeur unique couvrant la totalité de la table. L’exemple suivant produit des valeurs de synthèse pour chaque secteur géographique de ventes dans la base de données AdventureWorks2022. Le résumé répertorie la moyenne des bonus reçus par les vendeurs dans chaque secteur, ainsi que la somme des ventes annuelles à ce jour pour chaque secteur.

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

Voici le jeu de résultats.

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. Utilisation de la fonction AVG avec DISTINCT

Cette instruction retourne les prix moyens des produits dans la base de données AdventureWorks2022. En utilisant DISTINCT, le calcul considère uniquement les valeurs uniques.

SELECT AVG(DISTINCT ListPrice)
FROM Production.Product;

Voici le jeu de résultats.

------------------------------
437.4042

(1 row(s) affected)

D. Utilisation de la fonction AVG sans DISTINCT

Sans DISTINCT, la fonction AVG recherche le prix moyen de tous les produits dans la table Product de la base de données AdventureWorks2022, y compris les valeurs en doublon.

SELECT AVG(ListPrice)
FROM Production.Product;

Voici le jeu de résultats.

------------------------------
438.6662

(1 row(s) affected)

E. Utilisation de la clause OVER

L’exemple suivant utilise la fonction AVG avec la clause OVER pour fournir une moyenne mobile des ventes annuelles pour chaque secteur dans la table Sales.SalesPerson de la base de données AdventureWorks2022. Les données sont partitionnées par TerritoryID et classées logiquement par SalesYTD. Cela signifie que la fonction AVG est calculée pour chaque secteur selon l'année de vente. Pour TerritoryID 1, il y a deux lignes pour l’année de vente 2005, qui représentent les deux vendeurs avec des ventes cette année. Les ventes moyennes pour ces deux lignes sont calculées, puis la troisième ligne représentant les ventes de l'année 2006 est incluse dans le calcul.

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;

Voici le jeu de résultats.

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)

Dans cet exemple, la clause OVER n’inclut pas PARTITION BY. Cela signifie que la fonction s’applique à toutes les lignes retournées par la requête. La clause ORDER BY spécifiée dans la clause OVER détermine l'ordre logique dans lequel la fonction AVG s’applique. La requête retourne une moyenne mobile des ventes par année, pour tous les secteurs de vente spécifiés dans la clause WHERE. La clause ORDER BY spécifiée dans l'instruction SELECT détermine l'ordre dans lequel cette instruction affiche les lignes de la requête.

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;

Voici le jeu de résultats.

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)