@San4es123123

Как составить SQL запрос для группировки?

Консоль ругается на конструкцию.

SELECT trips_amount, COUNT(company_name) AS cnt FROM cabs, trips GROUP BY trips_amount;

Ошибка в консоли - ERROR: aggregate functions are not allowed in GROUP BY

Пробовал еще так делать конструкцию -
SELECT COUNT(company_name) AS trips_amount FROM cabs, trips GROUP BY start_ts, end_ts;

там вообще консоль не реагирует

В условиях:
Выведи поле company_name. Поле с числом поездок назови trips_amount и выведи его.
Результаты, полученные в поле trips_amount отсортируй по убыванию.
  • Вопрос задан
  • 109 просмотров
Решения вопроса 1
shurshur
@shurshur
Ну для начала надо правильно сделать JOIN таблиц cabs и trips. Для лучшего понимания советую посмотреть, что возвращает:

SELECT * FROM cabs,trips;

Как это исправить рассказывать я уже рассказывать не буду - это элементарные основы.

Далее, не надо писать COUNT на что попало, нужно чётко понимать, что должен делать запрос. В данном случае если не использовать группировку, запрос должен извлечь из базы все строки по принципу:

компания1 ... поездка1
компания1 ... поездка2
компания2 ... поездка1
... итд

Нужно сгруппировать по компании, а поездки агрегировать функцией их количества, например, так:

SELECT company_name, COUNT(*) AS trips_amount ... GROUP BY company_name;

В SQL при использовании агрегирующих функций все неагрегированные столбцы надо завести в GROUP BY. В некоторых случаях можно обойтись фиктивной агрегацией. Например, если мы хотим вместе с компанией выводить её адрес, который у всех строк и так будет одинаковый, можно сделать так:

SELECT company_name, MIN(company_address), ... GROUP BY company_name;

Хотя разумнее так (и заодно всплывут различия в компаниях с одним распространённым именем типа ООО "Вектор" и разными адресами):

SELECT company_name, company_address, ... GROUP BY company_name, company_address;

И в конце всё это надо отсортировать. Некоторые базы типа MySQL позволят сделать ORDER BY trips_amount DESC, а вот в Oracle, например, нельзя использовать тут алиасы, придётся сделать ORDER BY COUNT(*) DESC.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@nozzy
Silex, Symfony, Laravel, SQL
Покажи поля таблиц
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы