Выбор ответа Senior SQL для аналитика обновлено

DISTINCT как пластырь

Вопрос

После добавления JOIN с таблицей платежей сумма заказов в отчёте выросла почти вдвое. Коллега предлагает SUM(DISTINCT o.amount). Почему это плохая идея?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Это прячет размножение строк и склеит разные заказы с равной суммой. Причина роста в размножении строк: у заказа несколько платежей, после JOIN он повторяется.

Варианты ответа

  1. Это прячет размножение строк и склеит разные заказы с равной суммойправильный ответ
  2. Идея хорошая: именно так и убирают дубли сумм после JOIN в отчётах
  3. SUM(DISTINCT) работает только с целыми числами, а суммы дробные
  4. DISTINCT нельзя использовать внутри агрегатной функции SUM

Разбор

Причина роста в размножении строк: у заказа несколько платежей, после JOIN он повторяется. SUM(DISTINCT) суммирует уникальные значения, и два разных заказа по 1200 рублей превратятся в одно слагаемое. Лечится агрегацией платежей до JOIN или подзапросом. Синтаксически SUM(DISTINCT) допустим и для дробных чисел.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.