Нужно получить количество заказов по паре (user_id, status) из таблицы orders. Какой запрос верный?

ASELECT user_id, status, COUNT(*) FROM orders GROUP BY user_id;
BSELECT user_id, status, COUNT(*) FROM orders GROUP BY user_id, status;
CSELECT user_id, status, COUNT(*) FROM orders GROUP BY status, COUNT(*);
DSELECT user_id, status, COUNT(*) FROM orders GROUP BY 1;
Правильный ответ. При группировке по нескольким полям все поля без агрегата должны быть перечислены в GROUP BY.

Разбор

Чтобы посчитать количество строк по комбинации значений, нужно указать все поля комбинации в GROUP BY. Запрос SELECT user_id, status, COUNT(*) FROM orders GROUP BY user_id, status; корректен. Если в GROUP BY указать только user_id, СУБД пожалуется на status как на не-агрегированное поле. Если попытаться сгруппировать по COUNT(*), синтаксис вообще невалиден. Запись GROUP BY 1 группирует только по первому полю и не даёт разрез по status.

Можно заниматься бесплатно

Готовим вопросы…

Три вопроса по теме этой страницы, с объяснениями.

Продолжить в браузере

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