ОК, поэтому мы берем внутреннее соединение между sitdownrestaurant
и reservations
.
Мы делаем левое внешнее соединение с рекомендациями. Если мы сделали внутреннее объединение с рекомендациями, мы хотим, чтобы каждый пользователь имел как оговорку, так и рекомендацию. Однако, поскольку нам нужны записи для всех бронирований, даже без рекомендаций, вместо этого мы используем внешнее объединение.
Затем мы группируемся по ресторану. Если мы сделаем count(recommendations.RestaurantId)
, это будет считать все ненулевые значения в группе. Поскольку внешнее объединение будет использовать NULL, когда не было соответствующей записи, это будет число рекомендаций.
Однако count(sitdownrestaurant.RestaurantId)
будет подсчетом всех записей.
Итакпроцент будет равен количеству рекомендаций, деленному на общее количество записей для ресторана. (Вы можете умножить это на 100, чтобы получить процент.)
select count(recommendations.RestaurantId)/count(sitdownrestaurant.RestaurantId)
from sitdownrestaurant
inner join reservations
on reservations.RestaurantId = sitdownrestaurant.RestaurantId
left outer join recommendations
on recommendations.RestaurantId = sitdownrestaurant.RestaurantId
and recommendations.UserName = reservations.UserName
group by sitdownrestaurant.RestaurantId