JavaRush /Курсы /SQL SELF /Суммирование данных с SUM() — синтаксис и примеры

Суммирование данных с SUM() — синтаксис и примеры

SQL SELF
7 уровень , 2 лекция
Открыта

Представьте себе... У вас есть длиннющий список покупок из супермаркета. Вы хотите подсчитать, сколько в итоге вы потратили денег. Не будете же вы складывать всё вручную, верно? А вот у продавцов всё уже в базе данных. Поэтому вы получаете результирующий чек с правильной суммой. Скорее всего, где-то в их приложении им помогает героиня нашей сегодняшней лекции — функция SUM()! Это агрегатная функция, которая позволяет складывать значения в колонке числового типа.

Синтаксис SUM()

Функция SUM() выглядит так же просто, как её название, но давайте разберём всё по частям:

SELECT SUM(столбец)
FROM таблица;

Функция берет все значения в указанном столбце и суммирует их. Работает с числовыми типами (SMALLINT, INTEGER, BIGINT, NUMERIC, REAL, DOUBLE PRECISION), а также с типами INTERVAL и MONEY. Для строк или обычных дат — не работает.

Примеры использования SUM()

Давайте начнем с простого примера. Мы будем работать с таблицей salaries, которая хранит зарплаты сотрудников:

employee_id salary
1 50000
2 60000
3 55000
4 75000

Пример 1: Суммирование всех зарплат

Вы хотите узнать общий фонд заработной платы компании. Вот как это сделать:

SELECT SUM(salary) AS total_salary
FROM salaries;

Результат:

total_salary
240000

Что тут произошло? PostgreSQL сложил все значения из столбца salary (50000 + 60000 + 55000 + 75000) и вернул результат в новом столбце с названием total_salary.

Пример 2: Суммирование с условием

Допустим, вы хотите узнать общую зарплату только сотрудников, которые получают больше 55,000. Вспомним наш любимый оператор WHERE:

SELECT SUM(salary) AS high_salary_total
FROM salaries
WHERE salary > 55000;

Результат:

high_salary_total
135000

Что произошло здесь? Сначала PostgreSQL применил фильтр WHERE salary > 55000, оставив только строки с зарплатами 60000 и 75000. Затем он сложил эти две зарплаты (60000 + 75000).

3. Особенности работы SUM()

Как NULL влияет на SUM()? Как мы уже видели, NULL — это "ничто", и SUM() не включает его в расчеты. Рассмотрим таблицу:

employee_id salary
1 50000
2 60000
3 NULL
4 75000

Если мы захотим узнать общий фонд зарплат:

SELECT SUM(salary) AS total_salary
FROM salaries;

Результат:

total_salary
185000

Почему "185000", а не "NULL"? PostgreSQL просто игнорирует NULL при расчете суммы.

Примеры сложных запросов с SUM()

Пример 1: Суммирование и фильтрация в одном запросе

Представьте таблицу sales, которая хранит данные о продажах. Вот её структура:

product_id amount
1 150
2 200
3 NULL
1 100

Вы хотите узнать общую сумму продаж amount только для первого продукта product_id = 1:

SELECT SUM(amount) AS total_sales
FROM sales
WHERE product_id = 1;

Результат:

total_sales
150

Пример 2: Сумма и дополнительные вычисления

Снова работаем с таблицей salaries. Вы хотите узнать, насколько фонд зарплат превышает 200,000:

SELECT SUM(salary) - 200000 AS surplus
FROM salaries;

Результат:

surplus
40000

Типичные ошибки при использовании SUM()

Использование SUM() для нечисловых данных: если вы случайно попытаетесь суммировать, скажем, текстовые значения, то получите ошибку. Будьте аккуратны и проверяйте типы данных в вашем столбце.

Игнорирование NULL: часто новички забывают про NULL и считают, что он участвует в расчетах. Это может привести к неожиданным результатам.

2
Задача
SQL SELF, 7 уровень, 2 лекция
Недоступна
Суммирование всех элементов столбца
Суммирование всех элементов столбца
2
Задача
SQL SELF, 7 уровень, 2 лекция
Недоступна
Суммирование с условием
Суммирование с условием
Комментарии (10)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Anny Уровень 8
3 августа 2026
информации много, внезапно оказалось, что куча числовых типов, а про них ничего не рассказано. При этом в заданиях все достаточно просто...ощущение, что я прохожу уроки, но что-то упускаю....
Euraks Уровень 49
2 июня 2026
🦔
C0N5P1RACY Уровень 1
25 февраля 2026
Не забыть бы про кавычки...
7 ноября 2025
"Типичные ошибки при использовании SUM() Игнорирование NULL: часто новички забывают про NULL и считают, что он участвует в расчетах. Это может привести к неожиданным результатам." Что имеется ввиду? Приведите, пожалуйста, пример.
Андрей Уровень 9 Expert
20 августа 2026
Суть ошибки в том, что SQL-функция SUM() полностью игнорирует строки с NULL, а не заменяет их на ноль «на лету» во время математических операций внутри выражения. Главная ловушка возникает, когда новичок пишет арифметическое выражение внутри SUM(). В этом случае NULL ведет себя не как "0", а как "неизвестно", и любое действие с ним (сложение, вычитание) дает NULL. Затем SUM() игнорирует этот получившийся NULL, и вы теряете целые строки в итоговой сумме. Вот самый показательный пример: Таблица Продажи id price discount 1 100 10 2 200 NULL (скидки не было) 3 150 20 Ожидание новичка: Он думает: «Раз скидки нет, значит discount = 0. Итоговая цена со скидкой: (100-10) + (200-0) + (150-20) = 90 + 200 + 130 = 420». Реальность (ошибочный запрос):

SELECT SUM(price - discount) AS total FROM Sales;
Как это вычисляется на самом деле: Строка 1: 100 - 10 = 90 Строка 2: 200 - NULL = NULL (база данных не знает, что вычесть из 200, поэтому результат — неизвестность) Строка 3: 150 - 20 = 130 Теперь функция SUM получает на вход набор: (90, NULL, 130). Поскольку SUM игнорирует NULL, она сложит только 90 + 130. Результат: 220, а не 420. Вы потеряли целый заказ на 200 единиц в отчете! Правильный способ (избегаем ошибки): Чтобы получить ожидаемые 420, нужно вынести SUM к каждому столбцу отдельно. Тогда NULL будет проигнорирован внутри своей колонки (как будто его и нет):

SELECT SUM(price) - SUM(discount) AS total FROM Sales;
SUM(price) = 100 + 200 + 150 = 450
SUM(discount) = 10 + 20 = 30 (NULL игнорируется) Итог: 450 - 30 = 420 ✅
Андрей Уровень 9 Expert
20 августа 2026
Второй частый случай (среднее арифметическое) Если вы считаете среднее вручную через SUM(amount) / COUNT(*), а в колонке есть NULL, вы получите заниженный результат, потому что SUM игнорирует NULL, а COUNT(*) считает все строки. Данные: (100, NULL, 200) SUM = 300, COUNT(*) = 3. Ручное среднее = 100. Но встроенная функция AVG(amount) вернет 150, потому что она игнорирует NULL и делит на 2 (только на фактические числа). Вывод: Всегда помните, что NULL в SQL — это отсутствие значения, а не ноль. Если вы подставляете столбец с NULL в математическое выражение внутри SUM(), результат выражения для этой строки станет NULL, и строка выпадет из подсчета.
Slevin Уровень 59
1 сентября 2025
Слишком легко (и повторение первой лекции, да)
Anemon Уровень 13 Expert
13 августа 2025
🤓
Мария Уровень 13
21 июля 2025
слишком много опечаток, практически в каждом уроке встречаются(
Вячеслав Уровень 10
3 июля 2025
В "Примере 1: Суммирование и фильтрация в одном запросе" total_sales = 250, а не 150 ))