Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
SQL Analytics-eindpunt in Microsoft Fabric
Magazijn in Microsoft Fabric
SQL-database in Microsoft Fabric
Deze functie geeft het gemiddelde van de waarden in een groep terug. Het negeert null-waarden.
Transact-SQL syntaxis-conventies
Syntaxis
AVG ( [ ALL | DISTINCT ] expression )
[ OVER ( [ partition_by_clause ] order_by_clause ) ]
Arguments
ALL
Hiermee past u de statistische functie toe op alle waarden. ALLES is de standaard.
DUIDELIJK
Specificeert dat AVG slechts op één unieke instantie van elke waarde werkt, ongeacht hoe vaak die waarde voorkomt.
expressie
Een uitdrukking van de exacte numerieke of benaderende numerieke datatypecategorie, behalve voor het bitdatatype . Statistische functies en subquery's zijn niet toegestaan.
OVER ( [ partition_by_clause ] order_by_clause)
partition_by_clause verdeelt de door de FROM-clausule geproduceerde resultaatset in partities waarop de functie wordt toegepast. Als deze niet is opgegeven, behandelt de functie alle rijen van de queryresultatenset als één groep. De order_by_clause bepaalt de logische volgorde waarin de bewerking wordt uitgevoerd. De order_by_clause is vereist. Voor meer informatie, zie OVER-clausule (Transact-SQL).
Retourtypen
Het geëvalueerde resultaat van expressie bepaalt het retourtype.
| Expressieresultaat | Resultaattype |
|---|---|
| tinyint | int |
| smallint | int |
| int | int |
| bigint | bigint |
| Decimale categorie (P, S) | decimaal(38, max(s,6)) |
| Geld- en kleingeldcategorie | geld |
| float en reële categorie | float |
Opmerkingen
Als het datatype van de expressie een alias-datatype is, is het retourtype ook van het alias-datatype. Als echter het basisdatatype van het aliasdatatype wordt gepromoveerd, bijvoorbeeld van tinyint naar int, neemt de returnwaarde het gepromoveerde datatype en niet het aliasdatatype.
AVG () berekent het gemiddelde van een verzameling waarden door de som van die waarden te delen door het aantal niet-nul waarden. Als de som de maximale waarde voor het datatype van de returnwaarde overschrijdt, geeft AVG() een foutmelding terug.
AVG is een deterministische functie wanneer deze wordt gebruikt zonder de OVER- en ORDER BY-clausules. Het is nondeterministisch wanneer het wordt gespecificeerd met de OVER- en ORDER BY-clausules. Zie Deterministische en niet-deterministische functies voor meer informatie. Ook kan AVG zich als een niet-deterministische functie gedragen wanneer je het gebruikt met float- en real datatypes. Maar de onderliggende reden is de benaderende aard van deze datatypen.
Voorbeelden
Eén. Gebruik van de SUM- en AVG-functies voor berekeningen
Dit voorbeeld berekent de gemiddelde vakantieuren en de som van de ziekteverlofuren die de vicevoorzitters van Adventure Works Cycles hebben gebruikt. Elk van deze aggregatefuncties produceert één samenvattende waarde voor alle opgehaalde rijen. Het voorbeeld gebruikt de AdventureWorks2025-database.
SELECT AVG(VacationHours)AS 'Average vacation hours',
SUM(SickLeaveHours) AS 'Total sick leave hours'
FROM HumanResources.Employee
WHERE JobTitle LIKE 'Vice President%';
Hier is het resultatenoverzicht.
Average vacation hours Total sick leave hours
---------------------- ----------------------
25 97
(1 row(s) affected)
B. Met behulp van de SUM- en AVG-functies met een GROUP BY-clausule
Wanneer gebruikt met een GROUP BY clausule, produceert elke aggregatefunctie één enkele waarde die elke groep dekt, in plaats van één enkele waarde die de hele tabel dekt. Het volgende voorbeeld geeft samenvattende waarden voor elk verkoopgebied in de AdventureWorks2025-database. De samenvatting geeft de gemiddelde bonus weer die de verkopers in elk gebied ontvingen, en de som van de jaar-tot-nu verkopen per territorium.
SELECT TerritoryID, AVG(Bonus)as 'Average bonus', SUM(SalesYTD) as 'YTD sales'
FROM Sales.SalesPerson
GROUP BY TerritoryID;
GO
Hier is het resultatenoverzicht.
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. AVG gebruiken met DISTINCT
Deze verklaring geeft de gemiddelde lijstprijs van producten in de AdventureWorks2025-database terug. Door DISTINCT te gebruiken, houdt de berekening alleen rekening met unieke waarden.
SELECT AVG(DISTINCT ListPrice)
FROM Production.Product;
Hier is het resultatenoverzicht.
------------------------------
437.4042
(1 row(s) affected)
D. AVG gebruiken zonder DISTINCT
Zonder DDISTINCT vindt de AVG functie de gemiddelde lijstprijs van alle producten in de Product tabel in de AdventureWorks2025-database, inclusief eventuele dubbele waarden.
SELECT AVG(ListPrice)
FROM Production.Product;
Hier is het resultatenoverzicht.
------------------------------
438.6662
(1 row(s) affected)
E. Gebruik van de OVER-clausule
Het volgende voorbeeld gebruikt de AVG-functie met de OVER-clausule om een voortschrijdend gemiddelde van jaarlijkse verkopen voor elk gebied in de Sales.SalesPerson tabel in de AdventureWorks2025-database te bieden. De gegevens zijn gepartitioneerd door TerritoryID en logisch geordend door SalesYTD. Dit betekent dat de AVG-functie voor elk gebied wordt berekend op basis van het verkoopjaar. Voor TerritoryID 1 zijn er twee rijen voor verkoopjaar 2005, die de twee verkopers met verkopen dat jaar vertegenwoordigen. De gemiddelde verkoop voor deze twee rijen wordt berekend, waarna de derde rij die de verkopen voor het jaar 2006 vertegenwoordigt in de berekening wordt meegenomen.
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;
Hier is het resultatenoverzicht.
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)
In dit voorbeeld bevat de OVER-clausule PARTITION BY niet. Dit betekent dat de functie van toepassing is op alle rijen die door de query worden teruggegeven. De ORDER BY-clausule die in de OVER-clausule is gespecificeerd, bepaalt de logische volgorde waarop de AVG-functie van toepassing is. De zoekopdracht geeft een voortschrijdend gemiddelde van de verkopen per jaar terug voor alle verkoopgebieden die zijn gespecificeerd in de WHERE-clausule. De ORDER BY-clausule die in de SELECT-instructie is gespecificeerd, bepaalt de volgorde waarin de SELECT-instructie de rijen van de query weergeeft.
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;
Hier is het resultatenoverzicht.
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)