sql >> Databáze >  >> RDS >> Database

SQL AVG() pro začátečníky

V SQL, AVG() funkce je agregační funkce, která vrací průměr všech hodnot v daném výrazu.

Lze jej také použít k vrácení průměru všech odlišných (jedinečných) hodnot ve výrazu.

Výraz musí být číselný (nesmí to být znakový řetězec, bitový řetězec nebo datum a čas).

Níže je uvedeno několik základních příkladů, které demonstrují, jak to funguje.

Ukázková tabulka

Předpokládejme, že máme následující tabulku:

SELECT * FROM Products; 

Výsledek:

+-------------+------------+------------------- --------------+----------------+------------------ ------------------------+| ProductId | VendorId | Název produktu | Cena produktu | Popis produktu ||-------------+------------+-------------------- -------------+----------------+-------------------- -----------------------|| 1 | 1001 | Šroubovák pro levou ruku | 25,99 | Nachový. Včetně přepravního boxu pro levou ruku. || 2 | 1001 | Dlouhá hmotnost (modrá) | 14,75 | Zahrnuje dlouhé čekání. || 3 | 1001 | Dlouhá hmotnost (zelená) | 11,99 | Čekací doba cca 30 minut. || 4 | 1002 | Sáňkařské kladivo | 33,49 | Dřevěná rukojeť. Skleničky na víno zdarma. || 5 | 1003 | Motorová pila | 245,00 | Oranžový. Včetně náhradních prstů. || 6 | 1003 | Box pro psy ze slámy | NULL | Svázané vinnou révou. Velmi žvýkací. || 7 | 1004 | Hrnky na kávu bez dna (4 balení) | 9,99 | Hnědá keramika s pevnou rukojetí. || 8 | 1001 | Pravý šroubovák | 25,99 | Modrý. Obsahuje přepravní box pro pravou ruku. |+-------------+------------+---------------------- ------------+----------------+--------------------- ---------------------+

Příklad

K získání průměru všech cen můžeme použít následující dotaz.

SELECT AVG(ProductPrice)
FROM Products; 

Výsledek:

+---------------------+| (Žádný název sloupce)   ||--------------------|| 52,457142          |+---------------------+

V tomto případě jsou informace o ceně uloženy v ProductPrice a tak to předáme jako argument do AVG() funkce, která pak vypočítá průměr a vrátí výsledek.

Použití aliasů sloupců

Všimnete si, že předchozí výsledky neobsahují název sloupce. To se dá očekávat, protože AVG() funkce nevrací žádné sloupce. Název sloupce můžete snadno zadat přiřazením aliasu.

SELECT AVG(ProductPrice) AS Average
FROM Products; 

Výsledek:

+------------+| Průměr   ||-----------|| 52,457142 |+-----------+

Filtrované výsledky

AVG() funkce pracuje na řádcích vrácených dotazem. Pokud tedy filtrujete výsledky, výsledek AVG() to bude odrážet.

SELECT AVG(ProductPrice) AS Average
FROM Products
WHERE VendorId = 1001; 

Výsledek:

+------------+| Průměr   ||-----------|| 19,680000 |+-----------+

V tomto případě je 19,680000 průměrná cena všech produktů nabízených uvedeným prodejcem.

NULL Hodnoty

AVG() funkce ignoruje všechny NULL hodnoty. V naší vzorové tabulce výše číslo produktu 6NULL v jeho ProductPrice sloupec, ale to bylo v našem AVG() ignorováno příklad.

V závislosti na vašem DBMS a vašem nastavení se může nebo nemusí zobrazit varování, že NULL hodnoty byly ze sady výsledků vyloučeny.

Zde je příklad toho, co můžete vidět:

SELECT AVG(ProductPrice) AS Average
FROM Products; 

Výsledek:

+------------+| Průměr   ||-----------|| 52.457142 |+-----------+Upozornění:Hodnota Null je eliminována agregací nebo jinou operací SET.

To vše nám říká, že sloupec obsahoval alespoň jeden NULL hodnotu a že byla při výpočtu výsledků ignorována.

Datum/čas

AVG() funkce nepřijímá výrazy data/času.

Předpokládejme, že máme následující tabulku:

SELECT PetName, DOB 
FROM Pets; 

Výsledek:

+-----------+------------+| Jméno mazlíčka | DOB ||-----------+------------|| Načechraný | 2020-11-20 || Načíst | 2019-08-16 || Škrábnout | 2018-10-01 || Wag | 2020-03-15 || Tweet | 2020-11-28 || Načechraný | 2020-09-17 || Kůra | NULL || Mňau | NULL |+-----------+------------+

Pokud se pokusíme použít AVG() na DOB sloupec, zobrazí se chyba.

SELECT AVG(DOB) AS Average
FROM Pets; 

Výsledek:

Zpráva 8117, Úroveň 16, Stav 1, Řádek 1 Datum datového typu operandu je pro operátora avg neplatné.

Údaje o postavách

AVG() funkce také nepřijímá výrazy řetězce znaků.

Zde je to, co se stane, když se pokusíme použít AVG() na ProductName sloupec našich Products tabulka (která používá datový typ varchar):

SELECT AVG(ProductName) AS Average
FROM Products; 

Výsledek:

Zpráva 8117, úroveň 16, stav 1, řádek 1Operand datový typ varchar je pro operátor avg neplatný.

DISTINCT Klíčové slovo

Můžete použít DISTINCT klíčové slovo s AVG() vypočítat pouze odlišné hodnoty. To znamená, že pokud existují nějaké duplicitní hodnoty, jsou považovány za jednu hodnotu.

Příklad:

SELECT AVG(DISTINCT ProductPrice) AS DistinctAverage
FROM Products; 

Výsledek:

+-------------------+| DistinctAverage   ||-------------------|| 56,868333         |+--------------------+

Vidíme, že tento výsledek je vyšší než výsledek, který jsme získali bez DISTINCT klíčové slovo.

Abychom to shrnuli, dostali jsme 52,457142 bez DISTINCT klíčové slovo a 56.868333 s DISTINCT klíčové slovo.

Je to proto, že existují dvě položky, které sdílejí stejnou cenu (levý šroubovák a šroubovák pro pravou ruku mají oba cenu 25,99). Proto AVG() při použití s ​​funkcí DISTINCT klíčové slovo, považuje obě tyto hodnoty za jednu a podle toho vypočítá svůj výsledek.

Funkce okna

V závislosti na vašem DBMS možná budete moci použít OVER klauzule s vaším AVG() funkce pro vytvoření funkce okna.

Funkce okna provádí operaci podobnou agregaci na sadě řádků dotazu. Vytváří výsledek pro každý řádek dotazu. To je na rozdíl od agregované operace, která seskupuje řádky dotazu do jednoho řádku výsledku.

Zde je příklad pro demonstraci konceptu.

Již jsme viděli Products stůl. Naše databáze má také Customers tabulka a obsahuje následující údaje:

+--------------+----------------------+-------- -----------+------------+-----------------+------- -----+-----------+----------------+| Číslo zákazníka | Jméno zákazníka | PoštovníAdresa | Město | StateProvince | PSČ | Země | Telefon ||--------------+----------------------+---------- ----------+------------+-----------------+--------- ----+-----------+----------------+| 1001 | Palmová spíž | 20 Esplanáda | Townsville | QLD | 2040 | AUS | (308) 555-0100 || 1002 | Vysoký Mák | 12 Hlavní silnice | Kolumbus | OH | 43333 | USA | (310) 657-0134 || 1003 | Crazy Critters | 10 nekonečných smyček | Cairns | QLD | 4870 | AUS | (418) 555-0143 || 1004 | Jejda média | 4 Beachside Drive | Perth | WA | 1234 | AUS | (405) 443-5987 || 1005 | Strange Names Inc. | 789 George Street | Sydney | NSW | 2000 | AUD | (318) 777-0177 || 1006 | Hi-Five Solutionists | 5 High Street | Vysočina | ahoj | 1254 | AUS | (415) 413-5182 |+--------------+----------------------+---- ---------------+------------+------------------+--- ---------+-----------+----------------+

Můžeme načíst data z těchto tabulek a prezentovat je jako jednu sadu výsledků pomocí spojení.

Můžeme také použít AVG() funkce s OVER klauzule k aplikaci funkce okna na data.

SELECT 
    v.VendorName,
    p.ProductName,
    p.ProductPrice,
    AVG(ProductPrice) OVER (PARTITION BY v.VendorName) AS "Average For This Vendor"
FROM Products p 
INNER JOIN Vendors v 
ON v.VendorId = p.VendorId
ORDER BY VendorName, ProductPrice, "Average For This Vendor"; 

Výsledek:

+---------------+------------------------------ ---+----------------+---------------------------+| Název dodavatele    | Název produktu                     | Cena produktu   | Průměr pro tohoto dodavatele   ||---------------+---------------------------- -----+----------------+---------------------------- || Katty Koťátka | Hrnky na kávu bez dna (4 balení) | 9,99           | 9,990000                  || Dodávky Mars | Dlouhá váha (zelená)             | 11,99          | 19,680000                 || Dodávky Mars | Dlouhá váha (modrá)              | 14,75          | 19,680000                 || Dodávky Mars | Šroubovák pro pravou ruku        | 25,99          | 19,680000                 || Dodávky Mars | Šroubovák pro levou ruku         | 25,99          | 19,680000                 || Medaile pedálů  | Box pro slaměné psy                   | NULL           | 245 000 000                || Medaile pedálů  | Motorová pila                        | 245,00         | 245 000 000                || Randy Roofers | Sáňkařské kladivo                   | 33,49          | 33,490000                 |+---------------+-------------------------------- --+----------------+---------------------------+ 

V tomto případě jsme použili OVER klauzule s naším AVG() funkce k rozdělení výsledku podle názvu dodavatele.

Díky tomu jsme byli schopni vrátit informace o ceně pro každý produkt a také průměrnou cenu všech produktů od daného dodavatele. Průměrná cena se mění podle toho, jak se mění dodavatel (pokud náhodou nemá více dodavatelů stejný průměr), ale zůstává stejná pro všechny produkty od stejného dodavatele.

Tento koncept lze také aplikovat na další agregační funkce v SQL, jako je SUM() , MIN() , MAX() a COUNT() .


  1. Říjen 2014CPU havaruje ArcGIS Desktop

  2. mysql -> vložit do tbl (vybrat z jiné tabulky) a nějaké výchozí hodnoty

  3. Jak navrhnout databázi mysql pro více tenantů

  4. Odeslat e-mail ze spouštěče v SQL Server (T-SQL)