Перейти к содержимому

Как перемножить столбцы в sql

  • автор:

Произведение значений столбца

Почему среди агрегатных функций Язык структурированных запросов) — универсальный компьютерный язык, применяемый для создания, модификации и управления данными в реляционных базах данных. SQL нет произведения?

Такой вопрос часто задают в профессиональных социальных сетях. Речь идёт о произведении значений столбца таблицы при выполнении группировки. Функции типа PRODUCT нет в стандарте языка, и я не знаю СУБД, которая её бы имела. Хорошей же новостью является то, что такую функцию просто выразить через три другие, которые есть в арсенале практически всех серверов БД. Итак.

Пусть требуется перемножить значения столбца value следующей таблицы:

Консоль

Выполнить

Воспользуемся следующим свойством логарифмов: логарифм произведения равен сумме логарифмов, для нашего примера это означает

Если теперь применить обратную к натуральному логарифму ( Ln ) функцию экспоненты ( exp ), то получим

Итак, произведение чисел мы можем заменить выражением, стоящим в равенстве справа. Осталось записать эту формулу на языке SQL, учитывая, что сами числа находятся в столбце value.

Консоль

Выполнить

Правильность результата легко проверить устным счетом, или в Excel :-).

Рассмотренное решение не является универсальным. Поскольку логарифм не определен для чисел

Консоль

Выполнить

будет получено сообщение об ошибке:

An invalid floating point operation occurred.

(Попытка выполнить недопустимую операцию с плавающей запятой.)

Для учета «недопустимых» значений доработаем наше решение в соответствии со следующим алгоритмом:

  1. Если среди значений есть нули, то результатом будет 0.
  2. Если число отрицательных значений нечетное, то домножаем произведение абсолютных значений столбца на -1.
  3. Если число отрицательных значений четное, то результатом будет произведение абсолютных значений столбца.

Вот решение с комментариями, реализующее этот алгоритм:

Консоль

Выполнить

Обратите внимание на условие value <> 0 в последней строке запроса. Его присутствие связано с тем, что, хотя ветвь оператора CASE с вычислением выражения через логарифм не реализуется при наличии нулей среди значений столбца (возвращается 0), Cистема управления реляционными базами данных (СУБД), разработанная корпорацией Microsoft. SQL Server всё равно вычисляет это выражение и возвращает ошибку.

Сообразительные уже спросили: «А как быть с NULL?»

Действительно, наше решение даёт в этом случае 0. Будем следовать общей логике поведения агрегатных функций — не учитывать NULL. Ниже приводится окончательное решение, которое имеет одно отличие по сравнению с предыдущим решением. Кто догадается какое?

Консоль

Выполнить

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

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