Нужно посчитать сумму оплаченных заказов по каждому пользователю. В таблице orders есть поля user_id, amount, status. Какой запрос корректен и наиболее эффективен?

ASELECT user_id, SUM(amount) FROM orders GROUP BY user_id HAVING status = 'paid';
BSELECT user_id, SUM(amount) FROM orders WHERE status = 'paid' GROUP BY user_id;
CSELECT user_id, SUM(amount) FROM orders GROUP BY user_id WHERE status = 'paid';
DSELECT user_id, SUM(amount) FROM orders HAVING status = 'paid' GROUP BY user_id;
Правильный ответ. WHERE фильтрует строки до группировки, а HAVING — уже агрегированные группы.

Разбор

Фильтрацию по обычному (не агрегированному) полю status лучше делать в WHERE, чтобы отбрасывать лишние строки до агрегации и не суммировать неоплаченные заказы. HAVING применяется уже к группам после GROUP BY и подходит для условий на агрегаты, например HAVING SUM(amount) > 1000. Варианты с HAVING status = 'paid' без агрегата формально могут отработать, но это менее эффективно и не отражает смысл оператора. Порядок GROUP BY ... WHERE синтаксически некорректен.

Проверь себя · 1/3разбор после ответа
Что делает оператор HAVING в SQL-запросе с группировкой?
Тренировать SQL в Telegram

Ещё вопросы по теме «Агрегация, GROUP BY и HAVING»