Функцията T-SQL SUM е една от основните функции. Целта му е да изчисли сумата от всички стойности в посочената колона – имайте предвид, че се прилага само за числови колони.
По-долу е синтаксисът на SQL SUM.
-- Aggregate Function Syntax
SUM ( [ ALL | DISTINCT ] expression )
-- Analytic Function Syntax
SUM ([ ALL ] expression) OVER ( [ partition_by_clause ] order_by_clause)
- ВСИЧКИ е стойност по подразбиране, която не е задължителна за предаване. Позволява връщане на сумата от всички стойности.
- ОТЛИЧНО указва, че трябва да връща само сумата от уникални стойности, като игнорира дублиращи се стойности.
- Израз е точната или приблизителната категория числови тип данни, с изключение на бита тип данни.
- НАД клауза с partition_by_clause и клауза_по_порядък е за използване на тази функция на конкретен дял.
- раздел_по_клауза разделя резултатния набор, произведен от клаузата FROM, на дялове, към които се прилага функцията
- клауза_по_порядък определя логическия ред, в който се извършва операцията.
За да демонстрирам използването на функцията SQL SUM, създадох таблица с име Служител . Има 5 колони – име ,заплата ,наем ,данък , иестество на заетостта . Следните случаи на употреба ще бъдат във фокуса:
- Основна или проста употреба на функцията SUM
- Използване на SUM с CASE изрази
- Използване на SUM с оператор GROUP BY
- Използване на SUM с клауза HAVING
- Прилагане на SUM за множество или сложни аритметични изрази
Също така ще научим други случаи на употреба, като използване на SUM с клауза WHERE, ORDER BY или използване на DISTINCT във функцията SUM, за да получим сумата от уникални стойности. Но първо нещата.
Случай на употреба 1:Проста SQL функция SUM
Както беше посочено по-горе, имам таблица с име Служител с няколко колони. Да приемем, че вашата компания иска да знае колко разходи за заплати харчат за всички служители. За да получите стойността, просто трябва да добавите заплатата на всички служители. SUM () ще улесни живота ви, предоставяйки бързо такива отчети.
Ще използваме функцията SUM () на зазаплата колона, а изходът ще бъде общите разходи за заплати, изразходвани за всички служители на компанията:
USE DBName
GO
SELECT SUM(Salary) As [Total Employees Cost]
FROM [dbo].[Employee]
Ако имате стойност NULL в колоната, тази функция ще я игнорира и ще продължи със стойността на следващия ред. По този начин може да имате NULL за всеки служител, който е напуснал организацията – компанията не плаща нищо на този ресурс.
Можете да видите изхода по-долу – той показва сумата от $885000, изразходвана за заплатите на служителите:
Ако има дублиране стойности във всяка колона и искате да получите сбора от всички уникални стойности, можете да използвате DISTINCT аргумент:
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
Изпълних и двете изявления заедно. Първо, това беше тази от предишната стъпка с всички стойности на заплатите. Вторият беше за уникални стойности – използваше DISTINCT аргумент.
Разгледайте екранната снимка по-долу – тя демонстрира изходите на двете изявления и те са различни. Когато използвам функцията SUM за всички стойности по подразбиране, изходът е $885000. Когато използвам DISTINCT аргумент за получаване само на сумата от уникални стойности, изходът е $65000.
По този начин имаме подобни стойности в тази колона. от гледна точка на бизнеса, това означава, че имаме малко служители, които получават същите суми като тяхната заплата.
Този пример демонстрира използването на DISTINCT аргумент за получаване на сумата от всички уникални стойности. На практика ни позволява да избягваме дублиращи се стойности от крайния резултат.
Можем също да използваме КЪДЕ клауза в SQL SUM (). Да приемем, че вашата компания иска да получи общите разходи, които харчи за служители, които получават повече от $100 000 като заплата, а не за постоянен служител, за да разбере разпределението на разходите. КЪДЕ клаузата ще филтрира резултата и предоставя общата цена според бизнес изискванията.
В изявлението на T-SQL по-долу можете да видите КЪДЕ добавена клауза вестеството на заетостта колона. Тази колона съхранява запис на всеки служител, независимо дали е постоянен или договорно нает.
Имайте предвид, че използвах оператора AND, за да обединя и двете изисквания:
USE DBName
GO
SELECT SUM(Salary) As [Total Employees Cost]
FROM [dbo].[Employee]
WHERE [Employment Nature] = ‘Contractor’ AND Salary >100000
GO
Резултатът показва, че компанията харчи $240 000 за тези служители, които получават $100 000 или повече, а не за постоянни служители.
Случай на използване 2:SQL SUM функция с CASE изрази
В нашия сценарий искаме да знаем колко служители работят като постоянни, заедно с другите им данни. за да получим този резултат, можем да използваме CASE израз в SUM () функция. Въпреки това, можете лесно да получите този резултат, като просто поставите WHERE клауза, понякога имате нужда от CASE и SUM в изискване за сложна заявка.
Разгледайте по-долу T-SQL оператор с CASE израз в SUM () функция:
--USE SUM function with CASE expression
SELECT
SUM(
CASE
WHEN [Employment Nature] = ‘Permanent’ THEN 1
ELSE 0
END) As [Total Employees],
FROM [dbo].[Employee]
Резултатът от горните изявления показва 4 – компанията има само 4 постоянни служители според записите им в Служител таблица.
Нека вземем друг пример за CASE с SUM () .
Докато проучвахме случай на употреба 1, открихме общите разходи, изразходвани за договорно наети служители, които получават $100 000 или повече в горния раздел в случай на употреба 1. Сега искаме да намерим броя на тези служители. И, СЛУЧАЙ израз отново ще се появи в картината.
Можем да използваме CASE в същия израз на T-SQL, използван преди. По-долу е примерът:
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
Резултатът ни показва, че 2 изпълнители работят и получават повече от $100 000.
Можете да използвате различни аспекти на CASE израз в SELECT изявление заедно с SUM () функция за задоволяване на вашите бизнес нужди.
Случай на употреба 3:SQL SUM функция с GROUP BY
Да предположим, че нашата компания иска да знае колко пари общо харчи за своите постоянни служители и колко пари харчи за договорно наети служители. Можем да получим този набор от резултати с помощта на SUM функция заедно с GROUP BY изявление.
Вижте по-долу T-SQL оператор. Използвах GROUP BY изявление за естеството на заетостта колона и приложи функцията SUM върху Заплата колона, за да получите общата заплата на всеки тип служители, категоризирани според техния трудов характер.
USE DBName
GO
SELECT [Employment Nature], SUM(Salary) As [Total Employees Cost]
FROM [dbo].[Employee]
GROUP BY [Employment Nature]
Резултатът предоставя общите пари, изразходвани за изпълнители и постоянни служители. Ако добавите и двете числа, тяхната сума ще бъде общите пари, изразходвани за заплатата на служителите им (сравнете това число с първата екранна снимка на тази статия).
ИЗПОЛЗВАЙТЕ Случай 4:SQL SUM функция с оператор HAVING
Сега ще проучим заедно използването на функцията SUM с изрази HAVING и GROUP BY. Нашият пример ще покаже списъка на служителите, които получават повече от $150 000 годишно. Можем да го получим, като просто използваме израза SELECT с клаузата WHERE, но ще ви покажа как да получите същия резултат с HAVING, GROUP BY и SUM.
Има 2 T-SQL скрипта. Резултатът от двата оператора е един и същ, но първият скрипт използва прост оператор SELECT, докато вторият код използва функцията SUM заедно с клаузите GROUP BY и 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
Вижте изходите на двата скрипта:
Има и друг аспект от използването на тези твърдения. Предадох аритметични изрази във функцията SUM, за да получа наема иданък разходи на служителите. След това приложих GROUP BY иИМАНЕ извлечения за взаплата колона. С прости думи, исках да знам общите разходи за наем и данъци, изразходвани от служители със заплата от $150 000 или повече.
Използвах и две заявки. Първият изброява подробностите за всички служители, които получават $150 000 или повече. Този изход се извлича само за валидиране и проверка. Вторият използва SUM функция на две колони (наем иданък ) като общите им разходи. След това се прилага GROUP BY иИМАНЕ клаузи:
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
Нека анализираме изхода. Първата заявка показва всички подробности за служителите със заплати от $150 000 или повече. Сега вижте втория резултат от заявката. Тук сме изчислили служителите и техните разходи въз основа на тяхното ограничение на заплатата, което е $150 000 или повече. По този начин потвърдихме, че нашата заявка с клаузите SUM, GROUP BY и HAVING връща правилни резултати.
Случай на употреба 5:SQL SUM функция с множество аритметични изрази
Функцията SUM предлага голяма гъвкавост, когато става въпрос за аритметични изрази. Можем да използваме множество аритметични изрази, като добавяне или изваждане между множество стойности на колони, когато е необходимо. Нека се обърнем към пример.
Искаме да извадим отчет за общите спестявания на нашите служители. Може да има различни колони за разходи или надбавки, като надбавка за наем на жилище, надбавки за пътуване, надбавка за храна и др. Нашата таблица Служител има две колони, свързани с разходите на служителите – наемът, платен за настаняване и данъците, платени на правителството. Можете да разберете концепцията и да я приложите към повече колони по подобен начин.
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
Първата заявка показва всички данни от таблицата Служител . Ще използваме тези данни като референция, за да проверим действителната ни продукция, върната от второто запитване за общите спестявания за всеки служител.
Получаваме това, като добавим всички разходи и след това извадим всички разходи от заплатата на служителя, както е дадено в SUM изявление за функция. Можете да го потвърдите, като ръчно изчислите тези данни от първия набор от резултати за всеки служител, за да го потвърдите.
Заключение
Проучихме множество случаи на използване на функцията SQL SUM с други клаузи. Между другото, съвременните цифрови инструменти за специалисти по SQL Server могат да опростят драстично тези задачи. Например, dbForge SQL Complete включва функция, която може да изчислява агрегатни функции от готовия набор от резултати в SSMS резултатната мрежа.
Може да споделите любимите си съвети, свързани с функцията SQL SUM. Можете да използвате секцията за коментари.