SQL server - Использование функции Avg () в предложении where - PullRequest
0 голосов
/ 09 января 2020

Я работаю над заданием обратной связи, я хочу получить список водителей за последние 30 дней, которые получили 5 звездных оценок от своих клиентов, у них должно быть среднее значение 25% 5 звездных оценок от их общего числа поездок за последние 30 дней и минимум 10 5-звездочных оценок

Используя приведенный ниже запрос, я могу получить водителей, которые получили более 10 5-звездочных оценок за последние 30 дней, но мне нужно проверить, что они должны иметь в среднем 25% 5-звездочных оценок из их общего числа поездок.

Select DriverId, Count(DriverId) as TotalStars from tblTripfeedback
where Rating = 5 and TripDate >= GetDate() - 30 
group by DriverId
Having Count(DriverId) > 10

Как включить среднее условие в вышеупомянутый запрос

, когда я пытаюсь получить их среднее значение 5-звездочных оценок в моем запросе выбора, используя запрос ниже я получаю DriverId в среднем столбце. Выберите DriverId, Count (DriverId) в качестве TotalStars, avg (DriverId) в качестве среднего значения из tblTripfeedback, где Rating = 5 и TripDate> = GetDate () - 30 групп по DriverId с количеством (DriverId)> 10

Ex - Driver с идентификатором 123 совершил 20 поездок за последние 30 дней, и он получил 15 оценок 5 звезд от своих клиентов, что означает 50% оценок 5 звезд, и он также выполнил другое условие минимум 10 поездок. Это означает, что он имеет право на вознаграждение в виде он получил более 25% рейтинга 5 звезд, а также минимум 10 поездок

1 Ответ

1 голос
/ 09 января 2020

Удалите условие Rating = 5 из предложения WHERE, чтобы запрос вернул все строки за последний месяц и использовал его для получения результатов с условным агрегированием:

select DriverId, 
  count(case when Rating = 5 then DriverId end) as TotalStars,
  100.0 * avg(case when Rating = 5 then 1.0 else 0 end) as Average5Stars
from tblTripfeedback
where TripDate >= GetDate() - 30 
group by DriverId
having 
  count(case when Rating = 5 then DriverId end) > 10 
  and  
  100.0 * avg(case when Rating = 5 then 1.0 else 0 end) > 25
...