Выбор ответа Senior SQL для аналитика обновлено
DISTINCT как пластырь
Вопрос
После добавления JOIN с таблицей платежей сумма заказов в отчёте выросла почти вдвое. Коллега предлагает SUM(DISTINCT o.amount). Почему это плохая идея?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Это прячет размножение строк и склеит разные заказы с равной суммой. Причина роста в размножении строк: у заказа несколько платежей, после JOIN он повторяется.
Варианты ответа
- Это прячет размножение строк и склеит разные заказы с равной суммойправильный ответ
- Идея хорошая: именно так и убирают дубли сумм после JOIN в отчётах
- SUM(DISTINCT) работает только с целыми числами, а суммы дробные
- DISTINCT нельзя использовать внутри агрегатной функции SUM
Разбор
Причина роста в размножении строк: у заказа несколько платежей, после JOIN он повторяется. SUM(DISTINCT) суммирует уникальные значения, и два разных заказа по 1200 рублей превратятся в одно слагаемое. Лечится агрегацией платежей до JOIN или подзапросом. Синтаксически SUM(DISTINCT) допустим и для дробных чисел.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.