Функция SQL Server SUM()

В этом руководстве вы узнаете, как использовать функцию SQL Server SUM() для вычисления суммы значений.

Введение в функцию SUM() SQL Server

Функция SUM() SQL Server — это агрегатная функция, которая вычисляет сумму всех или отдельных значений в выражении.

Вот синтаксис функции SUM():

SUM([ALL | DISTINCT ] expression)

В этом синтаксисе:

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

Функция SUM() игнорирует значения NULL.

ВСЕ против ОТДЕЛЬНЫХ

Давайте создадим новую таблицу, чтобы продемонстрировать разницу между параметрами ALL и DISTINCT:

CREATE TABLE t(
    val INT
);
INSERT INTO t(val)
VALUES(1),(2),(3),(3),(4),(NULL),(5);
SELECT
    val
FROM
    t;

Выход:

val
-----------
1
2
3
3
4
NULL
5
(7 rows affected)

Следующий оператор использует функцию SUM() для вычисления суммы всех значений в столбце val:

SELECT
    SUM(val) total
FROM
    t;

Выход:

total
-----------
18
Warning: Null value is eliminated by an aggregate or other SET operation.
(1 row affected)

Однако при использовании модификатора DISTINCT функция SUM() возвращает сумму уникальных значений в столбце val:

SELECT
    SUM(DISTINCT val) total
FROM
    t;

Выход:

total
-----------
15
Warning: Null value is eliminated by an aggregate or other SET operation.
(1 row affected)

Примеры функции SUM() SQL Server

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

1) Пример базовой функции SQL Server SUM()

В следующем операторе функция SUM() используется для расчета общих запасов всех товаров во всех магазинах:

SELECT 
    SUM(quantity) total_stocks
FROM 
    production.stocks;

Выход:

total_stocks
------------
13511
(1 row affected)

2) Использование функции SUM() с примером GROUP BY

В следующем операторе используется функция SUM() с предложением GROUP BY для поиска общего количества запасов по идентификатору магазина:

SELECT
    store_id,
    SUM(quantity) store_stocks
FROM
    production.stocks
GROUP BY
    store_id;

Вот что получилось:

store_id | store_stocks
---------+------------
1        | 4532
2        | 4359
3        | 4620
(3 rows)

В этом примере:

  • Во-первых, предложение GROUP BY разделило запасы по идентификатору магазина на группы.
  • Во-вторых, функция SUM() применяется к каждой группе для расчета общих запасов для каждой группы.

Если вы хотите отобразить название магазина вместо идентификатора магазина, вы можете использовать следующий оператор:

SELECT
    store_name,
    SUM(quantity) store_stocks
FROM
    production.stocks w
    INNER JOIN sales.stores s
        ON s.store_id = w.store_id
GROUP BY
    store_name;

Выход:

store_name       | store_stocks
-----------------+------------
Baldwin Bikes    | 4359
Rowlett Bikes    | 4620
Santa Cruz Bikes | 4532
(3 rows)

3) Пример использования функции SUM() с предложением HAVING

В следующем операторе используется функция SUM() в предложении HAVING для поиска запасов каждого продукта и возврата только тех продуктов, запасы которых превышают 100:

SELECT
    product_name,
    SUM(quantity) total_stocks
FROM
    production.stocks s
    INNER JOIN production.products p
        ON p.product_id = s.product_id
GROUP BY
    product_name
HAVING
    SUM(quantity) > 100
ORDER BY
    total_stocks DESC;

Выход:

product_name                                          | total_stocks
------------------------------------------------------+--------------
Electra Townie Original 7D - 2017                     | 125
Electra Townie Balloon 8D EQ Ladies' - 2016/2017/2018 | 121
Electra Townie Go! 8i - 2017/2018                     | 120
Electra Townie Commute 8D - 2018                      | 119
Sun Bicycles Cruz 7 - 2017                            | 115
Surly Straggler - 2018                                | 109
Sun Bicycles Cruz 3 - 2017                            | 109
Electra Townie Original 21D - 2018                    | 109
Electra Girl's Hawaii 1 16" - 2017                    | 107
(9 rows)\

4) Использование функции SUM() с примером выражения

В следующем примере выражение в функции SUM() используется для расчета чистой стоимости каждого заказа на продажу:

SELECT
    order_id,
    SUM(
        quantity * list_price *(1 - discount)
    ) net_value
FROM
    sales.order_items
GROUP BY
    order_id
ORDER BY
    net_value DESC;

Выход:

order_id | net_value
---------+------------
1541     | 29147.0264
937      | 27050.7182
1506     | 25574.9555
1482     | 25365.4344
...

Краткое содержание

  • Используйте функцию SUM() для вычисления суммы значений.
  • Используйте опцию DISTINCT для расчета суммы различных значений.
  • Используйте опцию ALL для расчета суммы всех значений, включая дубликаты.
Мирослав С.

Автор статей, ИБ-специалист