sql группировка повторяющихся строк

#sql #sql-server

#sql #sql-сервер

Вопрос:

Итак, вот код, который работает нормально, но не группирует дублированные значения.

 SELECT  CONCAT(driver.first_name, ' ', driver.last_name) AS [Driver Name],  AVG(RATING.score) AS Average_Score,  driver.driver_id,  CASE   WHEN AVG(RATING.score) = 1 THEN 'Driver is very bad.'  WHEN rating.score = 2 THEN 'Driver is bad.'  WHEN RATING.score = 3 THEN 'Driver is okay.'  WHEN RATING.score = 4 THEN 'Driver is good.'  WHEN RATING.score = 5 THEN 'Driver is excellent.'  END AS [Driver Performance] FROM  CALL INNER JOIN   RATING ON CALL.rating_id = RATING.rating_id INNER JOIN   DRIVER ON CALL.driver_id = DRIVER.driver_id GROUP BY   driver.first_name, driver.last_name, driver.driver_id, rating.score  

Как вы можете видеть

Как вы можете видеть, у Мехмета синара должно было быть 3 средних балла, но я не смог этого сделать.

Комментарии:

1. Выходите ,rating.score из ГРУППЫ МИМО.

2. @Serg когда я это делаю, я получаю ошибку». Столбец»РЕЙТИНГ.оценка» недопустим в списке выбора, поскольку он не содержится ни в агрегатной функции, ни в предложении GROUP BY.» Вызвано из строк функции case.

3. чтобы получить последовательный ответ, вы должны предоставить точную схему ваших данных, СУБД, которые вы используете, примеры данных и ожидаемый результат с объяснением.

4. @HamletHakobyan Конечно! Я использую Microsoft SQL. У меня есть рейтинговая таблица, в которой есть рейтинги водителей. Моя основная идея состоит в том, чтобы получить средние оценки драйверов и оценить их как производительность драйвера, видимую на изображении. Моя основная таблица-это таблица ВЫЗОВОВ, в которой есть идентификатор рейтинга и идентификатор драйвера. Я ожидаю получить 3 средних балла за водителя по имени «мехмет синар», но я не смог решить проблему.

Ответ №1:

Сначала вы должны последовательно использовать avg(RATING.score) все варианты ОБРАЩЕНИЯ. Далее, агрегированного столбца не должно быть в GROUP BY списке.

 select CONCAT(driver.first_name,' ',driver.last_name)as [Driver Name] , avg(RATING.score) as Average_Score,driver.driver_id, CASE WHEN avg(RATING.score) = 1 THEN 'Driver is very bad.'  WHEN avg(RATING.score) = 2 THEN 'Driver is bad.'  WHEN avg(RATING.score) = 3 THEN 'Driver is okay.'  WHEN avg(RATING.score) = 4 THEN 'Driver is good.'  WHEN avg(RATING.score) = 5 THEN 'Driver is excellent.' END AS [Driver Performance] FROM CALL INNER JOIN RATING ON CALL.rating_id=RATING.rating_id INNER JOIN DRIVER ON CALL.driver_id=DRIVER.driver_id GROUP BY driver.first_name,driver.last_name,driver.driver_id  

Комментарии:

1. Спасибо за ваш любезный ответ, но я все еще получаю тот же результат.

2. Таким образом, у вас есть разные комбинации driver.first_name,driver.last_name,driver.driver_id в ваших данных. Вероятно, вы можете удалить driver.driver_id для ВЫБОРА и ГРУППИРОВКИ ПО. Или может использоваться min/max/count( driver.driver_id) в SELECT.

3. Большое вам спасибо! Удаление идентификатора драйвера из SELECT и GROUP BY решило мою проблему.

Ответ №2:

В следующем примере кода показано, как правильно сгруппировать по водителю и вычислить средний балл

 create table driver (id int identity primary key, fullname nvarchar(450)) create table rating (id int identity primary key, driverId int, score float) insert driver values ('Fabio'), ('Laura') insert rating values (1, 2), (1, 3), (2, 4), (2, 5) select driver.fullname FullName, avg(rating.score) Score  from driver join rating on driver.id = rating.driverId group by driver.id, driver.fullname  

Результат

Полное имя Счет
Фабио 2.5
Лора 4.5

Фабио