sql >> Databasteknik >  >> RDS >> Database

Hur man filtrerar poster med aggregatfunktion SUM

Problem:

Du måste hitta rader där grupper har en summa av värden i en kolumn som är mindre än ett givet värde.

Exempel:

Vår databas har en tabell som heter company med data i följande kolumner:id , department , first_name , last_name och salary .

id avdelning förnamn efternamn lön
1 marknadsföring Lora Brun 2300
2 ekonomi John Jackson 3200
3 marknadsföring Michael Thomson 1270
4 produktion Tony Miller 6500
5 produktion Sally Grön 2500
6 ekonomi Olivier Svart 3450
7 produktion Jeniffer Michelin 2800
8 marknadsföring Jeremy Lorson 3600
9 marknadsföring Louis Smith 4200

Låt oss ta reda på namnen på avdelningar som har lönesummor för sina anställda mindre än 7 000.

Lösning:

SELECT department, SUM(salary)
FROM company
GROUP BY department
HAVING SUM(salary)<7000;

Här är resultatet:

avdelning summa
ekonomi 6550

Diskussion:

För att filtrera poster med aggregatfunktionen (funktionen SUM från tidigare), använd HAVING-satsen. För att beräkna summan av värden för varje grupp av rader, använd funktionen aggregering SUMMA. I den här frågan beräknas kolumnavdelningen med summan av alla löner för sina anställda som grupp (beräkna den med SUM-funktionen med kolumnen lön som argument). Eftersom du beräknar värdet för varje grupp av rader (vi grupperar rader efter namnet på avdelningen), har frågan en GROUP BY-sats med namnet på kolumnen för att gruppera rader (i vårt exempel, GROUP BY department ). Det sista steget är att använda aggregatfunktionen i HAVING-satsen. Kom ihåg att HAVING ska sättas efter GROUP BY-satsen. HAVING innehåller villkoret som jämför värdet som returneras av aggregatfunktionen med ett givet värde. Ovanifrån är det lönesummor med ett värde mindre än 7000 (SUM(salary)<7000 ). Här verifierar vi att lönesumman i varje avdelning är lägre än 7000. Frågan visade endast en avdelning, ekonomi, med löner på 6550.


  1. 2 sätt att returnera rader som endast innehåller icke-alfanumeriska tecken i Oracle

  2. Oracle subquery rolighet

  3. Förhindrar SELECT FOR UPDATE att andra anslutningar infogas när raden inte finns?

  4. Hur undviker man dela med noll-fel i SQL?