Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analysplattformssystem (PDW)
SQL-analysslutpunkt i Microsoft Fabric
Lager i Microsoft Fabric
SQL-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)