SQL Сервер - Рассчитать AVG () с помощью соединений - PullRequest
1 голос
/ 27 января 2020

У меня есть приложение для перевозки в кабине

У каждого водителя есть Поездка, и для каждой поездки может быть несколько клиентов (объединение в кабины), которые оставляют свои отзывы.

Теперь я хочу получить водители тех водителей, которые получили более 10 пятизвездочных оценок (5 *) и минимум 20%. Пятизвездочные оценки из их общего рейтинга, полученного от их клиентов.

Допустим, водитель получил всего 40 За последние 30 дней, из которых 16 являются 5-звездочными рейтингами, этот драйвер соответствует критериям не менее 10 5 * звездных оценок и более 20% 5 * оценок. Этот идентификатор драйвера должен быть выбран.

SELECT TR.[DriverId]
    ,100.0 * AVG(CASE 
            WHEN FE.[Rating] = 5
                THEN 1.0
            ELSE 0
            END) AS Percentage
FROM tblFeedback FE
LEFT OUTER JOIN tblTrip TR ON FE.TripId = TR.TripId
WHERE FE.DATE >= GETDATE() - 30
    AND FE.Rating = 5
GROUP BY DriverId
HAVING COUNT(CASE 
            WHEN FE.[Rating] = 5
                THEN DriverId
            END) >= 10
    AND 100 * AVG(CASE 
            WHEN FE.[Rating] = 5
                THEN 1.0
            ELSE 0
            END) > 20

Приведенный выше запрос показывает процент в 100 000 для всех драйверов, чьи идентификаторы получены, даже те драйверы, у которых общий процент составляет 18%, также выбираются и их процент составляет отображается как 100%.

Этот запрос полностью испортил мой отчет

Ответы [ 2 ]

0 голосов
/ 27 января 2020

Попробуйте это. Вам необходимо включить все рейтинги, чтобы рассчитать процент:

SELECT r.[DriverId], 100.0*r.five_stars/r.total_ratings AS Percentage
FROM (
  SELECT TR.[DriverId]
    SUM(CASE WHEN FE.Rating =5 THEN 1 ELSE 0 END) AS five_stars,
    SUM(*) AS total_ratings
  FROM tblFeedback FE
  INNER JOIN tblTrip TR ON FE.TripId = TR.TripId
  WHERE FE.DATE >= GETDATE() - 30
  GROUP BY TR.DriverId) r
WHERE r.five_stars>=10
AND 100.0*r.five_stars/r.total_ratings>20.0;
0 голосов
/ 27 января 2020

Я думаю, что проблема в вашем WHERE предложении. В частности, эта строка:

AND FE.Rating = 5

Это заставляет таблицу tblFeedback возвращать только те записи, которые имеют пятизвездочный рейтинг, и, следовательно, только пятизвездочные рейтинги используется в расчете. Попробуйте вывести эту строку и посмотреть, приблизились ли расчеты к тому, что вы ожидаете.

...