In SQL is de SUM()
functie is een aggregatiefunctie die de som van alle waarden in een bepaalde uitdrukking retourneert.
Het kan ook worden gebruikt om de som van alle afzonderlijke (unieke) waarden in een uitdrukking te retourneren.
De uitdrukking moet numeriek zijn (het mag geen tekenreeks, bitreeks of datetime zijn).
Hieronder staan enkele basisvoorbeelden om te laten zien hoe het werkt.
Voorbeeldtabel
Stel dat we de volgende tabel hebben:
SELECT * FROM Products;
Resultaat:
+-------------+------------+---------------------------------+----------------+-----------------------------------------+ | 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. | +-------------+------------+---------------------------------+----------------+-----------------------------------------+
Voorbeeld
We kunnen de volgende zoekopdracht gebruiken om de som van alle prijzen te krijgen.
SELECT SUM(ProductPrice)
FROM Products;
Resultaat:
+--------------------+ | (No column name) | |--------------------| | 367.20 | +--------------------+
In dit geval wordt prijsinformatie opgeslagen in de ProductPrice
kolom, en dus geven we dat door als argument aan de SUM()
functie, die vervolgens de som berekent en het resultaat retourneert.
Kolomaliassen gebruiken
U zult merken dat de vorige resultaten geen kolomnaam bevatten. Dit is te verwachten, omdat de SUM()
functie retourneert geen kolommen. U kunt eenvoudig een kolomnaam opgeven door een alias toe te wijzen.
SELECT SUM(ProductPrice) AS Sum
FROM Products;
Resultaat:
+--------+ | Sum | |--------| | 367.20 | +--------+
Gefilterde resultaten
De SUM()
functie werkt op de rijen die door de query worden geretourneerd. Dus als u de resultaten filtert, wordt het resultaat van SUM()
zal dat weerspiegelen.
SELECT SUM(ProductPrice) AS Sum
FROM Products
WHERE VendorId = 1001;
Resultaat:
+-------+ | Sum | |-------| | 78.72 | +-------+
In dit geval is 78,72 de som van alle producten die door de opgegeven leverancier worden aangeboden.
NULL
Waarden
De SUM()
functie negeert elke NULL
waarden. In onze voorbeeldtabel hierboven, productnummer 6
heeft NULL
in zijn ProductPrice
kolom, maar dat werd genegeerd in onze SUM()
voorbeeld.
Afhankelijk van uw DBMS en uw instellingen, ziet u mogelijk wel of niet een waarschuwing dat NULL
waarden zijn geëlimineerd in de resultatenset.
Hier is een voorbeeld van wat je zou kunnen zien:
SELECT SUM(ProductPrice) AS Sum
FROM Products;
Resultaat:
+--------+ | Sum | |--------| | 367.20 | +--------+ Warning: Null value is eliminated by an aggregate or other SET operation.
Dit alles vertelt ons dat de kolom ten minste één NULL
. bevatte waarde, en dat deze werd genegeerd bij het berekenen van de resultaten.
Datum-/tijdgegevens
De SUM()
functie accepteert geen uitdrukkingen voor datum/tijd.
Stel dat we de volgende tabel hebben:
SELECT PetName, DOB
FROM Pets;
Resultaat:
+-----------+------------+ | 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 | +-----------+------------+
Als we SUM()
. proberen te gebruiken op de DOB
kolom, krijgen we een foutmelding.
SELECT SUM(DOB) AS Sum
FROM Pets;
Resultaat:
Msg 8117, Level 16, State 1, Line 1 Operand data type date is invalid for sum operator.
Karaktergegevens
De SUM()
functie accepteert ook geen tekenreeksuitdrukkingen.
Dit is wat er gebeurt als we SUM()
proberen te gebruiken op de ProductName
kolom van onze Products
tabel (die het gegevenstype varchar gebruikt):
SELECT SUM(ProductName) AS Sum
FROM Products;
Resultaat:
Msg 8117, Level 16, State 1, Line 1 Operand data type varchar is invalid for sum operator.
De DISTINCT
Zoekwoord
U kunt de DISTINCT
. gebruiken zoekwoord met SUM()
om alleen verschillende waarden te berekenen. Dat wil zeggen, als er dubbele waarden zijn, worden deze als één waarde behandeld.
Voorbeeld:
SELECT SUM(DISTINCT ProductPrice) AS DistinctSum
FROM Products;
Resultaat:
+---------------+ | DistinctSum | |---------------| | 341.21 | +---------------+
We kunnen zien dat dit resultaat lager is dan het resultaat dat we kregen zonder de DISTINCT
zoekwoord.
Om samen te vatten, we kregen 367,20 zonder de DISTINCT
trefwoord, en 341.21 met de DISTINCT
zoekwoord.
Dit komt omdat er twee items zijn die dezelfde prijs delen (de linkshandige schroevendraaier en de rechtshandige schroevendraaier kosten beide 25,99). Daarom is de SUM()
functie, indien gebruikt met de DISTINCT
trefwoord, behandelt beide waarden als één en berekent het resultaat dienovereenkomstig.
Vensterfuncties
Afhankelijk van uw DBMS kunt u mogelijk een OVER
. gebruiken clausule met uw SUM()
functie om een vensterfunctie te creëren.
Een vensterfunctie voert een aggregatie-achtige bewerking uit op een set queryrijen. Het produceert een resultaat voor elke queryrij. Dit in tegenstelling tot een aggregatiebewerking, waarbij queryrijen worden gegroepeerd in een enkele resultaatrij.
Hier is een voorbeeld om het concept te demonstreren.
We hebben de Products
al gezien tafel. Onze database heeft ook een Customers
tabel, en het bevat de volgende gegevens:
+--------------+----------------------+-------------------+------------+-----------------+------------+-----------+----------------+ | 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 | +--------------+----------------------+-------------------+------------+-----------------+------------+-----------+----------------+
We kunnen gegevens uit deze tabellen halen en ze presenteren als één resultaatset door een join te gebruiken.
We kunnen ook de SUM()
. gebruiken functie met de OVER
clausule om een vensterfunctie op de gegevens toe te passen.
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";
Resultaat:
+---------------+---------------------------------+----------------+-----------------------+ | 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 | +---------------+---------------------------------+----------------+-----------------------+
In dit geval gebruikten we de OVER
clausule met onze SUM()
functie om het resultaat te partitioneren op naam van de leverancier.
Door dit te doen, konden we prijsinformatie voor elk product retourneren, evenals de som van alle producten van die bepaalde leverancier. De som verandert als de leverancier verandert (tenzij meerdere leveranciers dezelfde som hebben), maar blijft hetzelfde voor alle producten van dezelfde leverancier.
Dit concept kan ook worden toegepast op andere statistische functies in SQL, zoals AVG()
, MIN()
, MAX()
, en COUNT()
.