Sdílet prostřednictvím


Průměr (Transact-SQL)

Platí pro:SQL ServerAzure SQL DatabaseSpravovaná instance Azure SQLAzure Synapse AnalyticsAnalytics Platform System (PDW)Koncový bod analýzy SQL v Microsoft FabricSklad v Microsoft FabricDatabáze SQL v Microsoft Fabric

Tato funkce vrací průměr hodnot v grupě. Ignoruje nulové hodnoty.

Transact-SQL konvence syntaxe

Syntaxe

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

Arguments

ALL

Použije agregační funkci na všechny hodnoty. VŠE je výchozí.

ODLIŠNÝ

Specifikuje, že AVG funguje pouze na jedné jedinečné instanci každé hodnoty, bez ohledu na to, kolikrát se tato hodnota vyskytuje.

expression

Výraz přesné numerické nebo přibližné číselné datové kategorie, s výjimkou bitového datového typu. Agregační funkce a poddotazy nejsou povolené.

KONEC ( [ partition_by_clause ] order_by_clause)

partition_by_clause rozděluje množinu výsledků vytvořenou klauzulí FROM na partce, na které je funkce aplikována. Pokud není zadáno, funkce zachází se všemi řádky sady výsledků dotazu jako s jednou skupinou. order_by_clause určuje logické pořadí, v jakém je operace provedena. Je potřeba order_by_clause. Pro více informací viz OVER Clause (Transact-SQL).

Návratové typy

Vyhodnocený výsledek výrazu určuje typ návratu.

Výsledek výrazu Návratový typ
tinyint int
smallint int
int int
bigint bigint
Desetinná kategorie (P, S) desetinné(38, max(s,6))
Kategorie peněz a drobných peněz peníze
Floata reálná kategorie float

Poznámky

Pokud je datový typ výrazu alias datový typ, return typ je také datového typu aliasu. Pokud je však základní datový typ aliasu propagován, například z tinyint na int, návratová hodnota bere povýšený datový typ a nikoli alias datový typ.

AVG () vypočítá průměr množiny hodnot vydělením součtu těchto hodnot počtem nenulových hodnot. Pokud součet překročí maximální hodnotu datového typu vrácené hodnoty, AVG() vrátí chybu.

AVG je deterministická funkce, pokud se používá bez klauzul OVER a ORDER BY. Je nedeterministická, když je specifikována s klauzulemi OVER a ORDER BY. Další informace naleznete v tématu Deterministické a nedeterministické funkce. Také se AVG může chovat jako nedeterministická funkce, když ho použijete s plovoucími a reálnými datovými typy. Základním důvodem je však přibližná povaha těchto datových typů.

Examples

A. Použití funkcí SUM a AVG pro výpočty

Tento příklad počítá průměrné odpočet dovolených a součet hodin nemocenské, které použili viceprezidenti Adventure Works Cycles. Každá z těchto agregovaných funkcí vytváří jednu souhrnnou hodnotu pro všechny získané řádky. Příklad využívá databázi AdventureWorks2025.

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

Tady je soubor výsledků.

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

(1 row(s) affected)

B. Použití funkcí SUM a AVG s klauzulí GROUP BY

Při použití s klauzulí GROUP BY každá agregovaná funkce produkuje jednu hodnotu pokrývající každou skupinu, místo aby jedna hodnota pokrývala celou tabulku. Následující příklad vytváří souhrnné hodnoty pro každé prodejní území v databázi AdventureWorks2025. Souhrn uvádí průměrný bonus, který prodejci v každém území obdrželi, a součet prodejů za rok pro každé teritorium.

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

Tady je soubor výsledků.

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. Použití AVG s DISTINCT

Toto tvrzení vrací průměrnou prodejní cenu produktů v databázi AdventureWorks2025. Použitím DISTINCT se výpočet bere v úvahu pouze unikátní hodnoty.

SELECT AVG(DISTINCT ListPrice)
FROM Production.Product;

Tady je soubor výsledků.

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

(1 row(s) affected)

D. Použití AVG bez DISTINCT

Bez DISTINCT AVG funkce najde průměrnou cenovou hodnotu všech produktů v tabulce Product v databázi AdventureWorks2025, včetně duplicitních hodnot.

SELECT AVG(ListPrice)
FROM Production.Product;

Tady je soubor výsledků.

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

(1 row(s) affected)

E. Použití klauzule OVER

Následující příklad využívá funkci AVG s klauzulí OVER k poskytnutí klouzavého průměru ročních prodejů pro každé území v tabulce Sales.SalesPerson v databázi AdventureWorks2025. Data jsou rozdělena a TerritoryID logicky uspořádána podle SalesYTD. To znamená, že funkce AVG se počítá pro každé teritorium na základě prodejního roku. U TerritoryID 1 jsou dva řádky pro prodejní rok 2005, které představují dva prodejce s prodeji v daném roce. Průměrné tržby pro tyto dva řádky se vypočítávají a třetí řádek představující prodeje za rok 2006 je zahrnut do výpočtu.

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;

Tady je soubor výsledků.

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)

V tomto příkladu klauzule OVER neobsahuje PARTITION BY. To znamená, že funkce platí pro všechny řádky vrácené dotazem. Klauzule ORDER BY specifikovaná v klauzuli OVER určuje logické pořadí, na které se funkce AVG vztahuje. Dotaz vrací klouzavý průměr prodejů podle let pro všechna prodejní území specifikovaná v klauzuli WHERE. Klauzule ORDER BY specifikovaná v příkazu SELECT určuje pořadí, v jakém příkaz SELECT zobrazuje řádky dotazu.

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;

Tady je soubor výsledků.

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)