Нужно посчитать сумму оплаченных заказов по каждому пользователю. В таблице 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, чтобы отбрасывать лишние строки до агрегации. Корректный вариант: SELECT user_id, SUM(amount) FROM orders WHERE status = 'paid' GROUP BY user_id;.

Проверь себя · 1/3разбор после ответа
Что делает оператор DISTINCT?
Тренировать SQL в Telegram

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