Megosztás a következőn keresztül:


AVG (Transact-SQL)

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseFelügyelt Azure SQL-példányAzure Synapse AnalyticsElemzési platformrendszer (PDW)SQL Analytics-végpont a Microsoft FabricbenRaktár a Microsoft FabricbenSQL-adatbázis a Microsoft Fabricben

Ez a függvény a csoport értékeinek átlagát adja vissza. Figyelmen kívül hagyja a null értékeket.

Transact-SQL szintaxis konvenciók

Szemantika

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

Arguments

ALL

Az összesítő függvény alkalmazása az összes értékre. ALL az alapértelmezett.

KÜLÖNBÖZŐ

Megadja, hogy az AVG csak egy egyedi példányon működik minden értékből, függetlenül attól, hányszor fordul elő ez az érték.

kifejezés

A pontos numerikus vagy közelítő számszámos adattípus kategóriájának kifejezése, kivéve a bitadattípust. Az összesítő függvények és al lekérdezések nem engedélyezettek.

VÉGE ( [ partition_by_clause ] order_by_clause)

partition_by_clause a FROM klauzula által generált eredményhalmazt osztja szétosztásokra, amelyekhez a függvény alkalmazható. Ha nincs megadva, a függvény a lekérdezés eredményhalmazának összes sorát egyetlen csoportként kezeli. A order_by_clause határozza meg a művelet logikai sorrendjét. A order_by_clause kötelező. További információért lásd az OVER záradékot (Transact-SQL).

Visszatérési típusok

Az expresszió kiértékelt eredménye határozza meg a visszaküldés típusát.

Kifejezés eredménye Visszatérési típus
tinyint int
smallint int
int int
bigint bigint
Tizedes kategória (P, S) tizedes (38, max(s,6))
Pénz és Kispénz kategóriába pénz
Float és reaal kategória float

Megjegyzések

Ha az adott kifejezés adattípusa alias adattípus, akkor a visszaküldés típusa is az alias adattípusú. Azonban, ha az alias adattípus alapadattípusát előléptetjük, például tinyintbőlint-re, akkor a visszaküldött érték a előléptetett adattípust veszi, nem az alias adattípust.

AVG () egy értékhalmaz átlagát úgy számolja ki, hogy az értékek összegét elosztja a nem null értékek számával. Ha az összeg meghaladja a visszaadó adattípus maximális értékét, az AVG() hibát ad vissza.

Az AVG determinisztikus függvény, ha az OVER és ORDER BY klauzulák nélkül használják. Nem determinisztika, ha az OVER és ORDER BY klauzulákkal van megadva. További információ: Determinisztikus és Nemdeterminista függvények. Az AVG nemdeterminisztikus függvényként is úgy viselkedhet, ha float és real adattípusokkal használjuk. De az alapvető ok ezeknek az adattípusoknak a közelítő jellege.

Példák

A. A SUM és AVG függvények használata számításokhoz

Ez a példa kiszámítja az átlagos szabadságórákat, valamint a betegszabadság összegét, amelyeket az Adventure Works Cycles alelnökei használtak. Ezek az aggregált függvények mindegyike egyetlen összefoglaló értéket ad az összes lekért sorhoz. A példa az AdventureWorks2025 adatbázist használja.

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

Itt van az eredmények összessége.

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

(1 row(s) affected)

B. A SUM és AVG függvények használata egy GROUP BY záradékkal

Ha egy GROUP BY klauzulával együtt használják, minden aggregált függvény egyetlen értéket ad létre, amely minden csoportot lefed, nem pedig egyetlen értéket ad le, amely az egész táblát lefedi. Az alábbi példa összefoglaló értékeket hoz az egyes értékesítési területekről az AdventureWorks2025 adatbázisban. Az összefoglaló felsorolja az adott területen az értékesítők átlagos bónuszait, valamint az adott területek év óta elért eladásainak összegét.

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

Itt van az eredmények összessége.

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 használata DISTINCT-val

Ez a kimutatás adja vissza az AdventureWorks2025 adatbázisban szereplő termékek átlagos listárait. A DISTINCT használatával a számítás csak egyedi értékeket vesz figyelembe.

SELECT AVG(DISTINCT ListPrice)
FROM Production.Product;

Itt van az eredmények összessége.

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

(1 row(s) affected)

D. AVG használata DISTINCT nélkül

DISTINCT nélkül a AVG függvény megtalálja az összes termék átlagos Product listáraját az AdventureWorks2025 adatbázisban, beleértve a duplikált értékeket is.

SELECT AVG(ListPrice)
FROM Production.Product;

Itt van az eredmények összessége.

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

(1 row(s) affected)

E. Az OVER záradék használata

A következő példa az AVG függvényt az OVER záradékzal használja, hogy az AdventureWorks2025 adatbázis táblázatában szereplő területek Sales.SalesPerson éves eladásainak mozgó átlaját adja meg. Az adatokat partícióval TerritoryID osztják és logikusan rendezik .SalesYTD Ez azt jelenti, hogy az AVG függvényt minden területre az eladási év alapján számítják ki. TerritoryID Az 1-nél két sor van a 2005-ös értékesítési évre, amelyek a két értékesítőt jelölik, akik abban az évben eladták. E két sor átlagos eladásait kiszámítjuk, majd a 2006-os év harmadik sor is belekerül a számításba.

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;

Itt van az eredmények összessége.

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)

Ebben a példában az OVER klauzula nem tartalmazza a PARTITION BY-t. Ez azt jelenti, hogy a függvény minden lekérdezés által visszaadott sorra vonatkozik. Az OVER klauzulában meghatározott ORDER BY klauzula határozza meg az AVG függvény logikai sorrendjét. A lekérdezés az összes WHERE záradékban meghatározott értékesítési terület éves mozgó átlaját adja vissza. A SELECT utasításban megadott ORDER BY záradék határozza meg, hogy a SELECT utasítás sorainak sorrendje szerint jeleníti meg a lekérdezés sorait.

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;

Itt van az eredmények összessége.

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)