sql >> Database >  >> RDS >> Sqlserver

Hoe SQL Server T-SQL-functie te gebruiken SUM:5 use-cases

De T-SQL SUM-functie is een van de fundamentele functies. Het doel is om de som van alle waarden in de opgegeven kolom te berekenen - merk op dat dit alleen van toepassing is op numerieke kolommen.

Hieronder staat de syntaxis van SQL SUM.

-- Aggregate Function Syntax    
SUM ( [ ALL | DISTINCT ] expression )  

-- Analytic Function Syntax   
SUM ([ ALL ] expression) OVER ( [ partition_by_clause ] order_by_clause)
  • ALLE is een standaardwaarde, niet verplicht om door te geven. Hiermee kan de som van alle waarden worden geretourneerd.
  • DISTINCT specificeert dat het alleen de som van unieke waarden moet retourneren, dubbele waarden negerend.
  • Expressie is de exacte of geschatte numerieke gegevenstypecategorie, behalve de bit data type.
  • OVER -clausule met partition_by_clause en order_by_clause is voor het gebruik van deze functie op een specifieke partitie.
    • partition_by_clause verdeelt de resultaatset geproduceerd door de FROM-component in partities waarop de functie wordt toegepast
    • order_by_clause bepaalt de logische volgorde waarin de bewerking wordt uitgevoerd.

Om het gebruik van de SQL SUM-functie te demonstreren, heb ik een tabel gemaakt met de naam Employee . Het heeft 5 kolommen – naam , salaris , huren , belasting , en arbeidskarakter . De volgende use-cases staan ​​centraal:

  1. Basis of eenvoudig gebruik van de SUM-functie
  2. SUM gebruiken met CASE-expressies
  3. SUM gebruiken met GROUP BY-instructie
  4. SUM gebruiken met HAVING-clausule
  5. SUM toepassen op meerdere of complexe rekenkundige uitdrukkingen

We zullen ook andere use-cases leren, zoals het gebruik van SUM met de WHERE-clausule, ORDER BY-clausule of het gebruik van DISTINCT in de SUM-functie om de som van unieke waarden te krijgen. Maar eerst.

Gebruiksvoorbeeld 1:Eenvoudige SQL SUM-functie

Zoals hierboven vermeld, heb ik een tabel met de naam Werknemer met weinig kolommen. Stel dat uw bedrijf wil weten hoeveel salariskosten zij aan alle werknemers uitgeven. Om de waarde te krijgen, hoeft u alleen het salaris van alle werknemers op te tellen. SUM () maakt uw leven gemakkelijk door dergelijke rapporten snel te leveren.

We zullen de functie SUM () gebruiken op het salaris kolom, en de output zal de totale salariskosten zijn die aan alle werknemers van het bedrijf zijn uitgegeven:

USE DBName
GO
SELECT SUM(Salary) As [Total Employees Cost]
FROM [dbo].[Employee]

Als u een NULL-waarde in de kolom heeft, negeert deze functie deze en gaat u verder met de volgende rijwaarde. U kunt dus NULL hebben voor elke werknemer die de organisatie heeft verlaten - het bedrijf betaalt niets aan die resource.

U kunt de output hieronder zien - het toont het bedrag van $ 885000 dat is uitgegeven aan de salarissen van werknemers:

Als er duplicaat . zijn waarden in een kolom, en u wilt de som van alle unieke waarden, kunt u de DISTINCT argument:

USE DBName
GO
--Get the sum of all values from column salary
SELECT SUM(Salary) As [Total Employees Cost]
FROM [dbo].[Employee]
GO

--Get the sum of all unique values from column salary
SELECT SUM(DISTINCT Salary) As [Total Employees Cost]
FROM [dbo].[Employee]
GO

Ik heb beide statements samen uitgevoerd. Ten eerste was het die van de vorige trede met alle salariswaarden. De tweede was voor unieke waarden - het gebruikte de DISTINCT argument.

Bekijk de onderstaande schermafbeelding - het demonstreert de uitvoer van beide verklaringen, en ze zijn verschillend. Als ik standaard de SOM-functie voor alle waarden gebruik, is de uitvoer $ 885000. Wanneer ik de DISTINCT . gebruik argument om alleen de som van unieke waarden te krijgen, de output is $65000.

We hebben dus vergelijkbare waarden in deze kolom. in zakelijke termen betekent dit dat we weinig werknemers hebben die hetzelfde bedrag als hun salaris ontvangen.

Dit voorbeeld demonstreert het gebruik van de DISTINCT argument om de som van alle unieke waarden te krijgen. In de praktijk kunnen we hiermee dubbele waarden uit het eindresultaat vermijden.

We kunnen ook de WHERE . gebruiken clausule in SQL SUM (). Stel dat uw bedrijf de totale kosten wil krijgen die het uitgeeft voor werknemers die meer dan $ 100.000 als salaris ontvangen, en niet voor een vaste werknemer om de kostenverdeling te begrijpen. De WAAR clausule filtert het resultaat en geeft de totale kosten volgens zakelijke vereisten.

In de onderstaande T-SQL-instructie ziet u de WHERE clausule toegevoegd aan het Werkgelegenheidskarakter kolom. Deze kolom houdt een overzicht bij van elke werknemer, of het nu vaste of contractuele werknemers zijn.

Merk op dat ik de AND-operator heb gebruikt om beide vereisten te combineren:

USE DBName
GO
SELECT SUM(Salary) As [Total Employees Cost]
FROM [dbo].[Employee]
WHERE [Employment Nature] = ‘Contractor’ AND Salary >100000
GO

Uit de output blijkt dat het bedrijf $ 240000 uitgeeft aan die werknemers die $ 100.000 of meer ontvangen, en niet aan vaste werknemers.

Gebruik Case 2:SQL SUM-functie met CASE-expressies

In ons scenario willen we weten hoeveel werknemers in vaste dienst werken, samen met hun andere gegevens. om dit resultaat te krijgen, kunnen we de CASE . gebruiken uitdrukking in de SUM () functie. Hoewel je dit resultaat gemakkelijk kunt krijgen door simpelweg WHERE . te plaatsen clausule, soms heb je CASE . nodig en SUM in een complexe vraag.

Bekijk de onderstaande T-SQL-verklaring met de CASE uitdrukking binnen de SUM () functie:

--USE SUM function with CASE expression
SELECT 
SUM(
CASE
  WHEN [Employment Nature] = ‘Permanent’ THEN 1 
  ELSE 0 
  END) As [Total Employees],
   FROM [dbo].[Employee]

De output van de bovenstaande verklaringen toont 4 - het bedrijf heeft slechts 4 vaste werknemers volgens hun gegevens in de Werknemer tafel.

Laten we nog een voorbeeld nemen van CASE met SUM () .

Tijdens het verkennen van use case 1 hebben we de totale kosten gevonden die zijn uitgegeven aan contractuele werknemers die $ 100.000 of meer ontvangen in de bovenstaande sectie onder use case 1. Nu willen we het aantal van dergelijke werknemers vinden. En, de CASE uitdrukking komt weer in beeld.

We kunnen CASE . gebruiken in dezelfde T-SQL-instructie die eerder werd gebruikt. Hieronder is het voorbeeld:

USE DBName
GO
SELECT SUM(Salary) As [Total Employees Cost],
SUM(CASE WHEN [Employment Nature] = ‘Contractor’ AND Salary >100000 THEN 1
ELSE 0
END) AS [Contractors Headcount]
FROM [dbo].[Employee]
WHERE [Employment Nature] = ‘Contractor’ AND Salary >100000
GO

De output laat ons 2 aannemers zien die werken en meer dan $ 100.000 krijgen.

U kunt verschillende aspecten van de CASE . gebruiken uitdrukking in de SELECT statement samen met de SUM () functie om aan uw zakelijke behoeften te voldoen.

Gebruiksvoorbeeld 3:SQL SUM-functie met GROUP BY

Laten we aannemen dat ons bedrijf wil weten hoeveel geld het in totaal uitgeeft aan zijn vaste medewerkers en hoeveel geld het uitgeeft aan contractuele medewerkers. We kunnen deze resultatenset krijgen met de SUM functie samen met de GROUP BY verklaring.

Kijk naar de onderstaande T-SQL-verklaring. Ik heb de GROUP BY . gebruikt verklaring over het Werkgelegenheidskarakter kolom en paste de SOM-functie toe op het Salaris kolom om het totale salaris van elk type werknemer te krijgen, gecategoriseerd volgens hun arbeidskarakter.

USE DBName
GO
SELECT [Employment Nature], SUM(Salary) As [Total Employees Cost]
FROM [dbo].[Employee]
GROUP BY [Employment Nature]

De resultatenset geeft het totale geld weer dat wordt besteed aan aannemers en vaste medewerkers. Als u beide getallen optelt, is hun som het totale geld dat aan het salaris van hun werknemers is uitgegeven (vergelijk dit aantal met de eerste schermafbeelding van dit artikel).

GEBRUIK Case 4:SQL SUM-functie met HAVING-instructie

Nu zullen we het gebruik van de SUM-functie met HAVING- en GROUP BY-instructies samen onderzoeken. In ons voorbeeld wordt de lijst weergegeven met werknemers die meer dan $ 150.000 per jaar ontvangen. We kunnen het krijgen door simpelweg de SELECT-instructie met de WHERE-component te gebruiken, maar ik zal u laten zien hoe u hetzelfde resultaat kunt krijgen met HAVING, GROUP BY en SUM.

Er zijn 2 T-SQL-scripts. De uitvoer van beide instructies is hetzelfde, maar het eerste script gebruikt een eenvoudige SELECT-instructie, terwijl de tweede code de SUM-functie gebruikt samen met de clausules GROUP BY en HAVING.

USE DBName
GO
SELECT name, salary
FROM [dbo].[Employee]
WHERE Salary >=150000
GO

--SUM with HAVING
SELECT name, SUM(salary) AS [Salary]
FROM [dbo].[Employee]
GROUP BY name HAVING SUM(salary) >=150000
GO

Bekijk de uitvoer van beide scripts:

Er is nog een ander aspect van het gebruik van deze uitspraken. Ik heb rekenkundige uitdrukkingen in de SUM-functie doorgegeven om de huur . te krijgen en belasting kosten van medewerkers. Daarna heb ik GROUP BY . toegepast en HEBBEN uitspraken over het salaris kolom. In eenvoudige bewoordingen, ik wilde de totale huur- en belastinguitgaven weten die werden uitgegeven door werknemers met een salaris van $ 150.000 of meer.

Ik heb ook twee queries gebruikt. De eerste bevat de details van alle werknemers die $ 150.000 of meer ontvangen. Deze uitvoer wordt alleen opgehaald voor validatie en verificatie. De tweede gebruikt de SUM functie op twee kolommen (huur en belasting ) als hun totale kosten. Dan geldt GROUP BY en HEBBEN clausules:

USE DBName
GO
SELECT name, salary
FROM [dbo].[Employee]
WHERE Salary >=150000
GO

--SUM with HAVING and GROUP BY
SELECT name, SUM( rent + tax) AS [Total Expenses]
FROM [dbo].[Employee]
GROUP BY name HAVING SUM(salary) >=150000
GO

Laten we de output analyseren. De eerste zoekopdracht toont alle details van werknemers met een salaris van $ 150.000 of meer. Kijk nu naar het tweede queryresultaat. Hier hebben we de werknemers en hun uitgaven opgehaald op basis van hun salarisgrens, die $ 150.000 of meer is. Op deze manier hebben we geverifieerd dat onze zoekopdracht met de clausules SUM, GROUP BY en HAVING de juiste resultaten oplevert.

Gebruiksvoorbeeld 5:SQL SUM-functie met meerdere rekenkundige expressies

De SOM-functie biedt een grote flexibiliteit als het gaat om rekenkundige uitdrukkingen. We kunnen meerdere rekenkundige uitdrukkingen gebruiken, zoals optellen of aftrekken tussen meerdere kolomwaarden wanneer dat nodig is. Laten we naar een voorbeeld verwijzen.

We willen een rapport opmaken over de totale besparingen van onze medewerkers. Er kunnen verschillende kolommen met onkosten of toeslagen zijn, zoals huurtoeslag, reiskostenvergoeding, maaltijdtoeslag, etc. Onze tabel Medewerker heeft twee kolommen met betrekking tot de kosten van de werknemers:de huur die wordt betaald voor huisvesting en de belastingen die aan de overheid worden betaald. U kunt het concept begrijpen en het op dezelfde manier op meer kolommen toepassen.

USE DBName
GO
--List table data for reference
SELECT *
FROM [dbo].[Employee]
GO

--SUM with multiple arithmetic expressions
SELECT name, SUM(salary – (rent + tax)) AS [Total Savings]
FROM [dbo].[Employee]
GROUP BY name
GO

De eerste zoekopdracht toont alle gegevens uit de tabel Werknemer . We zullen deze gegevens gebruiken als referentie om onze werkelijke output te verifiëren die wordt geretourneerd door de tweede vraag over de totale besparingen voor elke werknemer.

Dit hebben we verkregen door alle onkosten bij elkaar op te tellen en vervolgens alle onkosten af ​​te trekken van het salaris van de werknemer zoals aangegeven in de SUM functie verklaring. U kunt het verifiëren door deze gegevens handmatig te berekenen vanaf de eerste resultatenset voor elke werknemer om het gevalideerd te krijgen.

Conclusie

We hebben meerdere use-cases van de SQL SUM-functie onderzocht met andere clausules. Trouwens, moderne digitale tools voor SQL Server-specialisten kunnen deze taken drastisch vereenvoudigen. dbForge SQL Complete bevat bijvoorbeeld een functie die geaggregeerde functies kan berekenen op basis van de kant-en-klare resultatenset in het SSMS-resultaatraster.

U kunt uw favoriete tips met betrekking tot de SQL SUM-functie delen. U bent van harte welkom om de sectie Opmerkingen te gebruiken.


  1. Is er een manier om meerdere triggers in één script te maken?

  2. TSQL - Hoe gebruik ik GO in een BEGIN .. END-blok?

  3. TOP 10 rijen ophalen zonder TOP of LIMIT te gebruiken? – Interviewvraag van de week #247

  4. Hoe een door de gebruiker gedefinieerde uitzondering te declareren met behulp van een uitzonderingsvariabele in Oracle Database?