Как посчитать сумму в sql
Перейти к содержимому

Как посчитать сумму в sql

  • автор:

Получение суммарных или статистических значений для всех строк в таблице (визуальные инструменты для баз данных)

Агрегатные функции позволяют вычислять сумму всех значений, содержащихся в таблице. Например, можно создать запрос наподобие того, что приведен ниже, для отображения общей стоимости всех книг, содержащихся в таблице titles :

SELECT SUM(price) FROM titles 

Создайте несколько агрегатов в одном запросе, используя агрегатные функции для одного или нескольких столбцов. Например, можно создать запрос, вычисляющий общую сумму по столбцу price и среднеарифметическое значение столбца discount .

В отдельном запросе для одного и того же столбца можно определять несколько статистических операций (подведение общей суммы, подсчет, усреднение). Например, следующий запрос определяет среднеарифметическое значение и общую сумму столбца price в таблице titles :

SELECT AVG(price), SUM(price) FROM titles 

Если добавить условия поиска, можно вычислять статистические значения на основе подмножества строк, удовлетворяющих заданному условию.

Можно также подсчитать, сколько всего в таблице содержится строк, или строк, удовлетворяющих определенному условию. Дополнительные сведения см. в разделе Подсчет строк в таблице (визуальные инструменты для баз данных).

Если в запросе указано статистическое выражение, то для всех строк в таблице отображается только само это статистическое значение. Например, при подсчете итогового значения столбца price в таблице titles названия, имена издателей и другие столбцы не отображаются.

! При создании подытогов (например, групп) можно выводить значения столбцов для каждой группы. Дополнительные сведения см. в разделе Группирование строк в результатах запроса (визуальные инструменты для баз данных).

Статистическая обработка значений по всем строкам

  1. Убедитесь, что таблица, в которой необходимо вычислить статистическую величину, присутствует на панели диаграмм
  2. Щелкните правой кнопкой мыши фон панели диаграммы, а затем в контекстном меню выберите пункт Группировать . Конструктор запросов и представлений добавляет столбец Группировать в сетку на панели критериев.
  3. Добавьте на панель критериев столбец, по которому необходимо вычислить статистическую величину. Убедитесь, что столбец помечен для вывода. Конструктор запросов и представлений автоматически назначает суммируемому столбцу псевдоним, который можно заменить более понятным. Дополнительные сведения см. в разделе Создание псевдонимов столбцов (визуальные инструменты для баз данных).
  4. В столбце сетки Группировать выберите нужную агрегатную функцию, например Sum, Avg, Min, Max, Count. Если необходимо вычислить статистические значения только для уникальных строк результирующего набора, выберите агрегатную функцию с параметром DISTINCT, например Min Distinct. Не выбирайте параметры Группировать, Выражениеили Где, так как они не применяются при статистической обработке всех строк. Конструктор запросов и представлений заменяет указанной агрегатной функцией имя столбца в инструкции, представленной на панели SQL . Например, инструкция SQL может иметь такой вид:
SELECT SUM(price) FROM titles 

При выполнении запроса на панели результатов отображаются указанные статистические выражения.

Конструктор запросов и представлений обслуживает агрегатные функции в инструкции, отображаемой на панели SQL до тех пор, пока режим «Группировать по» явно не будет выключен. Поэтому при изменении типа запроса или изменении состава таблиц и возвращающих табличное значение объектов, присутствующих на панелях диаграмм, конечный запрос может содержать недопустимые агрегатные функции.

Функция SQL SUM()

Оператор SQL SUM() — функция, возвращающая сумму значений столбца таблицы. Используется только для числовых столбцов.

Функция SQL SUM() имеет следующий синтаксис:

SUM ( [ALL | DISTINCT] expression )

Параметр ALL — является параметром по умолчанию. Считается сумма всех строк.

При указании параметра DISTINCT — происходит подсчет только уникальных значений.

Примеры оператора SQL SUM: Имеется следующая таблица Universities :

ID UniversityName Students Faculties Professores Location Site
1 Perm State National Research University 12400 12 1229 Perm psu.ru
2 Saint Petersburg State University 21300 24 13126 Saint-Petersburg spbu.ru
3 Novosibirsk State University 7200 13 1527 Novosibirsk nsu.ru
4 Moscow State University 35100 39 14358 Moscow msu.ru
5 Higher School of Economics 20335 12 1615 Moscow hse.ru
6 Ural Federal University 57000 19 5640 Yekaterinburg urfu.ru
7 National Research Nuclear University 8600 10 936 Moscow mephi.ru

Пример 1. Используя оператор SQL SUM найти количество студентов (Students) всех университетов в таблице:

SELECT SUM(Students) FROM Universities

Пример 2. Используя оператор SQL SUM найти количество преподавателей московских университетов:

SELECT SUM(Professores) FROM Universities WHERE Location = 'Moscow'

Пример 3. Используя оператор SQL SUM произвести подсчет уникальных значений столбца Faculties:

SELECT SUM(DISTINCT Faculties) FROM Universities

Ответ: 117 (примечание: в столбце Faculties присутствует 2 одинаковых записи, под ID 1 и 5. Значение столбца под ID 5 не суммируется.)

SUM (Transact-SQL)

Возвращает сумму всех, либо только уникальных, значений в выражении. Функция SUM может быть использована только для числовых столбцов. Значения NULL пропускаются.

Синтаксис

-- Aggregate Function Syntax SUM ( [ ALL | DISTINCT ] expression ) -- Analytic Function Syntax SUM ([ ALL ] expression) OVER ( [ partition_by_clause ] order_by_clause) 

Сведения о синтаксисе Transact-SQL для SQL Server 2014 (12.x) и более ранних версиях см . в документации по предыдущим версиям.

Аргументы

ВСЕ
Применяет агрегатную функцию ко всем значениям. ALL является параметром по умолчанию.

DISTINCT
Указывает, что функция SUM возвращает сумму уникальных значений.

выражение
Может быть константой, столбцом или функцией, а также любым сочетанием арифметических, побитовых и строковых операторов. expression — выражение категории точного числового или приблизительного числового типа данных, за исключением типа данных bit. Агрегатные функции и вложенные запросы не допускаются. Дополнительные сведения см. в статье Выражения (Transact-SQL).

OVER ( [ partition_by_clause ] order_by_clause)
partition_by_clause делит результирующий набор, полученный с помощью предложения FROM, на секции, к которым применяется функция. Если этот параметр не указан, функция обрабатывает все строки результирующего набора запроса как отдельные группы. order_by_clause определяет логический порядок, в котором выполняется операция. Аргумент order_by_clause является обязательным. Дополнительные сведения см. в статье Предложение OVER (Transact-SQL).

Типы возвращаемых данных

Возвращает сумму всех значений выражения, представленную в наиболее точном типе данных выражения.

Результат выражения Возвращаемый тип
tinyint int
smallint int
int int
bigint bigint
Категория decimal (p, s) decimal(38, s)
Категории money и smallmoney money
Категории float и real float

Замечания

SUM — это детерминированная функция, если она используется без предложений OVER и ORDER BY. Она не детерминирована при использовании с предложениями OVER и ORDER BY. Дополнительные сведения см. в разделе Deterministic and Nondeterministic Functions.

Примеры

А. Использование SUM для возвращения сводных данных

В следующих примерах показано использование функции SUM для возврата сводных данных в базе данных AdventureWorks2022.

SELECT Color, SUM(ListPrice), SUM(StandardCost) FROM Production.Product WHERE Color IS NOT NULL AND ListPrice != 0.00 AND Name LIKE 'Mountain%' GROUP BY Color ORDER BY Color; GO 
Color --------------- --------------------- --------------------- Black 27404.84 5214.9616 Silver 26462.84 14665.6792 White 19.00 6.7926 (3 row(s) affected) 

B. Использование предложения OVER

В следующем примере функция SUM используется с предложением OVER для предоставления совокупного объема ежегодных продаж для каждой территории в таблице базы Sales.SalesPerson данных AdventureWorks2022. Данные секционируются по TerritoryID и логически сортируются по SalesYTD . Это означает, что функция SUM вычисляется для каждой территории на основании продаж за год. Обратите внимание, что в TerritoryID 1 для продаж за 2005 год используются две строки, в которых представлены два менеджера по продажам с показателями за этот год. После расчета суммарного значения итога для двух данных строк в вычисление включается третья строка, представляющая продажи за 2006 год.

SELECT BusinessEntityID, TerritoryID ,DATEPART(yy,ModifiedDate) AS SalesYear ,CONVERT(VARCHAR(20),SalesYTD,1) AS SalesYTD ,CONVERT(VARCHAR(20),AVG(SalesYTD) OVER (PARTITION BY TerritoryID ORDER BY DATEPART(yy,ModifiedDate) ),1) AS MovingAvg ,CONVERT(VARCHAR(20),SUM(SalesYTD) OVER (PARTITION BY TerritoryID ORDER BY DATEPART(yy,ModifiedDate) ),1) AS CumulativeTotal FROM Sales.SalesPerson WHERE TerritoryID IS NULL OR TerritoryID < 5 ORDER BY TerritoryID,SalesYear; 
 BusinessEntityID TerritoryID SalesYear SalesYTD MovingAvg CumulativeTotal ---------------- ----------- ----------- -------------------- -------------------- -------------------- 274 NULL 2005 559,697.56 559,697.56 559,697.56 287 NULL 2006 519,905.93 539,801.75 1,079,603.50 285 NULL 2007 172,524.45 417,375.98 1,252,127.95 283 1 2005 1,573,012.94 1,462,795.04 2,925,590.07 280 1 2005 1,352,577.13 1,462,795.04 2,925,590.07 284 1 2006 1,576,562.20 1,500,717.42 4,502,152.27 275 2 2005 3,763,178.18 3,763,178.18 3,763,178.18 277 3 2005 3,189,418.37 3,189,418.37 3,189,418.37 276 4 2005 4,251,368.55 3,354,952.08 6,709,904.17 281 4 2005 2,458,535.62 3,354,952.08 6,709,904.17 (10 row(s) affected) 

В этом примере предложение OVER не включает в себя предложение PARTITION BY. Это означает, что функция будет применяться для всех строк, возвращаемых запросом. Предложение ORDER BY, указанное в предложении OVER, определяет логический порядок применения функции SUM. Запрос возвращает суммарное общее значение продаж за год для всех территорий, указанных в предложении WHERE. Предложение ORDER BY, указанное в инструкции SELECT, определяет порядок отображения строк запроса.

SELECT BusinessEntityID, TerritoryID ,DATEPART(yy,ModifiedDate) AS SalesYear ,CONVERT(VARCHAR(20),SalesYTD,1) AS SalesYTD ,CONVERT(VARCHAR(20),AVG(SalesYTD) OVER (ORDER BY DATEPART(yy,ModifiedDate) ),1) AS MovingAvg ,CONVERT(VARCHAR(20),SUM(SalesYTD) OVER (ORDER BY DATEPART(yy,ModifiedDate) ),1) AS CumulativeTotal FROM Sales.SalesPerson WHERE TerritoryID IS NULL OR TerritoryID < 5 ORDER BY SalesYear; 
BusinessEntityID TerritoryID SalesYear SalesYTD MovingAvg CumulativeTotal ---------------- ----------- ----------- -------------------- -------------------- -------------------- 274 NULL 2005 559,697.56 2,449,684.05 17,147,788.35 275 2 2005 3,763,178.18 2,449,684.05 17,147,788.35 276 4 2005 4,251,368.55 2,449,684.05 17,147,788.35 277 3 2005 3,189,418.37 2,449,684.05 17,147,788.35 280 1 2005 1,352,577.13 2,449,684.05 17,147,788.35 281 4 2005 2,458,535.62 2,449,684.05 17,147,788.35 283 1 2005 1,573,012.94 2,449,684.05 17,147,788.35 284 1 2006 1,576,562.20 2,138,250.72 19,244,256.47 287 NULL 2006 519,905.93 2,138,250.72 19,244,256.47 285 NULL 2007 172,524.45 1,941,678.09 19,416,780.93 (10 row(s) affected) 

Примеры: Azure Synapse Analytics и система платформы аналитики (PDW)

C. Простой пример функции SUM

В приведенном ниже примере возвращается общее количество единиц каждого продукта, проданное в 2003 году.

-- Uses AdventureWorks SELECT ProductKey, SUM(SalesAmount) AS TotalPerProduct FROM dbo.FactInternetSales WHERE OrderDateKey >= '20030101' AND OrderDateKey < '20040101' GROUP BY ProductKey ORDER BY ProductKey; 

Здесь приводится частичный результирующий набор.

ProductKey TotalPerProduct ---------- --------------- 214 31421.0200 217 31176.0900 222 29986.4300 225 7956.1500 

D. Вычисление общей суммы значений в нескольких столбцах

В следующем примере производится вычисление суммы значений столбцов ListPrice и StandardCost для каждого из значений цвета, указанных в таблице Product .

-- Uses AdventureWorks SELECT Color, SUM(ListPrice)AS TotalList, SUM(StandardCost) AS TotalCost FROM dbo.DimProduct GROUP BY Color ORDER BY Color; 

Первая часть результирующего набора показана ниже.

Color TotalList TotalCost ---------- ------------- -------------- Black 101295.7191 57490.5378 Blue 24082.9484 14772.0524 Grey 125.0000 51.5625 Multi 880.7468 526.4095 NA 3162.3564 1360.6185 

Как посчитать сумму SQL запросом?

Нужно вставить в таблицу 1 стоимость товара, которая равна сумме стоимости его запчастей.
товар id 7 цена=300+400+500
товар id 6 цена=200+300
Для каждого id из таблицы 2 посчитать его стоимость и обновить в таблице 1.
Можно ли это сделать SQL запросом без обработки данных через php и если да, то как?

Таблица 1 (данные и по товарам и по запчастям)
id price
1 100
2 200
3 300
4 400
5 500
6 0 - после обработки 500
7 0 - после обработки 1200
Таблица 2 (Id товара и Id запчастей к нему)
id id_zapchast
6 2
6 3
7 3
7 4
7 5

  • Вопрос задан более трёх лет назад
  • 14358 просмотров

Комментировать

Решения вопроса 1

LaRN

Senior Developer

Как то так:

Select t1.id, sum(t2.price) From таблица2 as t1 Inner join таблица1 as t2 on t2.id = t1.id_zapchast group by t1.id

Ответ написан более трёх лет назад

Комментировать

Нравится 3 Комментировать

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *