AVG (Transact-SQL)

Gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalysplattformssystem (PDW)SQL-analysslutpunkt i Microsoft FabricLager i Microsoft FabricSQL-databas i Microsoft Fabric

Denna funktion returnerar medelvärdet av värdena i en grupp. Den ignorerar nollvärden.

Transact-SQL syntaxkonventioner

Syntax

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

Arguments

ALL

Tillämpar aggregeringsfunktionen på alla värden. ALLT är standard.

SÄRSKILD

Specificerar att AVG endast arbetar på en unik instans av varje värde, oavsett hur många gånger det värdet förekommer.

uttryck

Ett uttryck för den exakta numeriska eller approximativa numeriska datatypskategorin, förutom bitdatatypen . Mängdfunktioner och underfrågor är inte tillåtna.

ÖVER ( [ partition_by_clause ] order_by_clause)

partition_by_clause delar in resultatmängden som produceras av FROM-satsen i partitioner där funktionen tillämpas. Om det inte anges behandlar funktionen alla rader i frågeresultatuppsättningen som en enda grupp. order_by_clause bestämmer den logiska ordningen i vilken operationen utförs. order_by_clause krävs. För mer information, se OVER-klausul (Transact-SQL).

Returtyper

Det utvärderade resultatet av uttrycket bestämmer returtypen.

Uttrycksresultat Returtyp
tinyint int
smallint int
int int
bigint bigint
Decimalkategori (P, S) decimal(38, max(s,6))
Kategori pengar och småpengar pengar
Flytt och reell kategori float

Anmärkningar

Om datatypen av uttrycket är en aliasdatatyp är returtypen också av aliasdatatypen. Om dock basdatatypen för alias-datatypen promoveras, till exempel från tinyint till int, tar returvärdet den promovade datatypen och inte aliasdatatypen.

AVG () beräknar medelvärdet av en uppsättning värden genom att dividera summan av dessa värden med antalet icke-nullvärden. Om summan överstiger det maximala värdet för datatypen för returvärdet, returnerar AVG() ett fel.

AVG är en deterministisk funktion när den används utan klausulerna OVER och ORDER BY. Det är icke-deterministiskt när det specificeras med OVER- och ORDER BY-klausulerna. Mer information finns i Deterministiska och nondeterministiska funktioner. Dessutom kan AVG verka som en icke-deterministisk funktion när du använder det med flyttal- och realdatatyper . Men den underliggande orsaken är den ungefärliga naturen hos dessa datatyper.

Examples

A. Användning av SUM- och AVG-funktionerna för beräkningar

Detta exempel beräknar de genomsnittliga semestertimmarna och summan av sjukdagar som vice ordförandena för Adventure Works Cycles har använt. Var och en av dessa aggregerade funktioner ger ett enda sammanfattningsvärde för alla hämtade rader. Exemplet använder AdventureWorks2025-databasen.

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

Här är resultatet.

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

(1 row(s) affected)

B. Att använda funktionerna SUM och AVG med en GROUP BY-klausul

När den används med en GROUP BY klausul producerar varje aggregerad funktion ett enda värde som täcker varje grupp, istället för ett enda värde som täcker hela tabellen. Följande exempel ger sammanfattande värden för varje försäljningsområde i AdventureWorks2025-databasen. Sammanfattningen visar den genomsnittliga bonusen som säljarna fått i varje territorium, samt summan av försäljningen hittills i år för varje område.

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

Här är resultatet.

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. Att använda AVG med DISTINCT

Detta uttalande returnerar det genomsnittliga listpriset på produkter i AdventureWorks2025-databasen. Genom att använda DISTINCT tar beräkningen endast hänsyn till unika värden.

SELECT AVG(DISTINCT ListPrice)
FROM Production.Product;

Här är resultatet.

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

(1 row(s) affected)

D. Att använda AVG utan DISTINCT

Utan DISTINCT AVG hittar funktionen det genomsnittliga listpriset för alla produkter i Product tabellen i AdventureWorks2025-databasen, inklusive eventuella dubblettvärden.

SELECT AVG(ListPrice)
FROM Production.Product;

Här är resultatet.

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

(1 row(s) affected)

E. Att använda OVER-klausulen

Följande exempel använder AVG-funktionen med OVER-klausulen för att ge ett glidande medelvärde av årliga försäljningar för varje territorium i Sales.SalesPerson tabellen i AdventureWorks2025-databasen. Datan är uppdelad med TerritoryID och logiskt ordnad efter SalesYTD. Detta innebär att AVG-funktionen beräknas för varje område baserat på försäljningsåret. För TerritoryID det första finns det två rader för försäljningsåret 2005, som representerar de två säljarna med försäljning det året. Genomsnittsförsäljningen för dessa två rader beräknas, och sedan inkluderas den tredje raden som representerar försäljning för år 2006 i beräkningen.

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;

Här är resultatet.

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)

I detta exempel inkluderar inte OVER-klausulen PARTITION BY. Detta innebär att funktionen gäller för alla rader som returneras av frågan. ORDER BY-klausulen som specificeras i OVER-klausulen bestämmer den logiska ordning som AVG-funktionen tillämpas på. Frågan returnerar ett glidande medelvärde av försäljningar, per år, för alla försäljningsområden som anges i WHERE-klausulen. ORDER BY-klausulen som anges i SELECT-satsen bestämmer i vilken ordning SELECT-satsen visar raderna i frågan.

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;

Här är resultatet.

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)