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

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

V SQL, SUM() funkce je agregační funkce, která vrací součet všech hodnot v daném výrazu.

Lze jej také použít k vrácení součtu 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   | ProductName                     | ProductPrice   | ProductDescription                      |
|-------------+------------+---------------------------------+----------------+-----------------------------------------|
| 1           | 1001       | Left handed screwdriver         | 25.99          | Purple. Includes left handed carry box. |
| 2           | 1001       | Long Weight (blue)              | 14.75          | Includes a long wait.                   |
| 3           | 1001       | Long Weight (green)             | 11.99          | Approximate 30 minute waiting period.   |
| 4           | 1002       | Sledge Hammer                   | 33.49          | Wooden handle. Free wine glasses.       |
| 5           | 1003       | Chainsaw                        | 245.00         | Orange. Includes spare fingers.         |
| 6           | 1003       | Straw Dog Box                   | NULL           | Tied with vines. Very chewable.         |
| 7           | 1004       | Bottomless Coffee Mugs (4 Pack) | 9.99           | Brown ceramic with solid handle.        |
| 8           | 1001       | Right handed screwdriver        | 25.99          | Blue. Includes right handed carry box.  |
+-------------+------------+---------------------------------+----------------+-----------------------------------------+

Příklad

K získání součtu všech cen můžeme použít následující dotaz.

SELECT SUM(ProductPrice)
FROM Products;

Výsledek:

+--------------------+
| (No column name)   |
|--------------------|
| 367.20             |
+--------------------+

V tomto případě jsou informace o ceně uloženy v ProductPrice a tak to předáme jako argument do SUM() funkce, která pak vypočítá součet 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 SUM() funkce nevrací žádné sloupce. Název sloupce můžete snadno zadat přiřazením aliasu.

SELECT SUM(ProductPrice) AS Sum
FROM Products;

Výsledek:

+--------+
| Sum    |
|--------|
| 367.20 |
+--------+

Filtrované výsledky

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

SELECT SUM(ProductPrice) AS Sum
FROM Products
WHERE VendorId = 1001;

Výsledek:

+-------+
| Sum   |
|-------|
| 78.72 |
+-------+

V tomto případě je 78,72 součet všech produktů nabízených zadaným prodejcem.

NULL Hodnoty

SUM() funkce ignoruje všechny NULL hodnoty. V naší vzorové tabulce výše číslo produktu 6NULL v jeho ProductPrice sloupec, ale to bylo ignorováno v našem SUM() 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 SUM(ProductPrice) AS Sum
FROM Products;

Výsledek:

+--------+
| Sum    |
|--------|
| 367.20 |
+--------+
Warning: Null value is eliminated by an aggregate or other SET operation.

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

SUM() 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:

+-----------+------------+
| PetName   | DOB        |
|-----------+------------|
| Fluffy    | 2020-11-20 |
| Fetch     | 2019-08-16 |
| Scratch   | 2018-10-01 |
| Wag       | 2020-03-15 |
| Tweet     | 2020-11-28 |
| Fluffy    | 2020-09-17 |
| Bark      | NULL       |
| Meow      | NULL       |
+-----------+------------+

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

SELECT SUM(DOB) AS Sum
FROM Pets;

Výsledek:

Msg 8117, Level 16, State 1, Line 1
Operand data type date is invalid for sum operator.

Údaje o postavách

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

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

SELECT SUM(ProductName) AS Sum
FROM Products;

Výsledek:

Msg 8117, Level 16, State 1, Line 1
Operand data type varchar is invalid for sum operator.

DISTINCT Klíčové slovo

Můžete použít DISTINCT klíčové slovo s SUM() 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 SUM(DISTINCT ProductPrice) AS DistinctSum
FROM Products;

Výsledek:

+---------------+
| DistinctSum   |
|---------------|
| 341.21        |
+---------------+

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

Abychom to shrnuli, dostali jsme 367,20 bez DISTINCT klíčové slovo a 341.21 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 SUM() 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 SUM() 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:

+--------------+----------------------+-------------------+------------+-----------------+------------+-----------+----------------+
| CustomerId   | CustomerName         | PostalAddress     | City       | StateProvince   | ZipCode    | Country   | Phone          |
|--------------+----------------------+-------------------+------------+-----------------+------------+-----------+----------------+
| 1001         | Palm Pantry          | 20 Esplanade      | Townsville | QLD             | 2040       | AUS       | (308) 555-0100 |
| 1002         | Tall Poppy           | 12 Main Road      | Columbus   | OH              | 43333      | USA       | (310) 657-0134 |
| 1003         | Crazy Critters       | 10 Infinite Loops | Cairns     | QLD             | 4870       | AUS       | (418) 555-0143 |
| 1004         | Oops Media           | 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     | Highlands  | HI              | 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 SUM() funkce s OVER klauzule k aplikaci funkce okna na data.

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

Výsledek:

+---------------+---------------------------------+----------------+-----------------------+
| VendorName    | ProductName                     | ProductPrice   | Sum For This Vendor   |
|---------------+---------------------------------+----------------+-----------------------|
| Katty Kittens | Bottomless Coffee Mugs (4 Pack) | 9.99           | 9.99                  |
| Mars Supplies | Long Weight (green)             | 11.99          | 78.72                 |
| Mars Supplies | Long Weight (blue)              | 14.75          | 78.72                 |
| Mars Supplies | Right handed screwdriver        | 25.99          | 78.72                 |
| Mars Supplies | Left handed screwdriver         | 25.99          | 78.72                 |
| Pedal Medals  | Straw Dog Box                   | NULL           | 245.00                |
| Pedal Medals  | Chainsaw                        | 245.00         | 245.00                |
| Randy Roofers | Sledge Hammer                   | 33.49          | 33.49                 |
+---------------+---------------------------------+----------------+-----------------------+

V tomto případě jsme použili OVER klauzule s naším SUM() 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é součet všech produktů od daného dodavatele. Součet se mění se změnou dodavatele (pokud náhodou nemá více dodavatelů stejný součet), 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 AVG() , MIN() , MAX() a COUNT() .


  1. SQL transponuje celou tabulku

  2. Změňte typ sloupce s čísly z varchar na int

  3. Nesoulad datových typů (kód 20) při vkládání

  4. Jak mohu používat Tvůrce výrazů v Accessu 2016?