Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Platí pro:SQL Server
Azure SQL Database
Spravovaná instance Azure SQL
Azure Synapse Analytics
Analytics Platform System (PDW)
Koncový bod analýzy SQL v Microsoft Fabric
Sklad v Microsoft Fabric
Databáze SQL v Microsoft Fabric
Tato funkce vrací průměr hodnot v grupě. Ignoruje nulové hodnoty.
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)
Související obsah
- agregační funkce
(Transact-SQL) - SELECT – OVER – klauzule (Transact-SQL)