Нужно посчитать долю выручки каждого товара от общей выручки за один и тот же период. Какой вариант делает расчёт прозрачнее и избегает дублирования фильтра по периоду?

AВо внешнем SELECT посчитать выручку по товару, а общий SUM взять скалярным подзапросом, повторив фильтр по периоду дважды.
BСделать базовый CTE WITH base AS (...) с фильтром по периоду, затем посчитать total и per_product из base, и в финальном SELECT делить per_product.product_amt на total.total_amt.
CИспользовать коррелированный подзапрос в WHERE, чтобы сразу оставить только товары с высокой долей.
DУбрать фильтр по периоду из SQL и применить его уже после выгрузки данных.
Правильный ответ. Базовый CTE помогает один раз зафиксировать период и правила отбора, а затем строить от него и числитель, и знаменатель.

Разбор

Доля — это отношение двух агрегатов, которые должны быть рассчитаны на одном и том же наборе строк. Если фильтр копируется в два места, легко ошибиться (период или условия различатся) и получить неконсистентную метрику. При подходе с WITH base AS (...) вы явно задаёте общий источник данных и используете его повторно, поэтому логика становится детерминированной и проверяемой.

Проверь себя · 1/3разбор после ответа
Что является практическим преимуществом разбиения сложного запроса на шаги через WITH по сравнению с несколькими вложенными подзапросами?
Тренировать SQL в Telegram

Ещё вопросы по теме «Подзапросы и CTE»