SQL-запрос для идентификации забронированного жилья

#sql #sql-server #count #subquery #left-join

#sql #sql-сервер #количество #подзапрос #левое соединение

Вопрос:

Мне нужно знать, какой оператор SQL использовать в базе данных размещения, ищущей пользователя поездки

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

1. изображения текста, такие как ваша домашняя работа и данные, не помогают нам помочь вам. Найдите время, чтобы переписать текст самостоятельно . Однако ошибка буквально говорит вам о проблеме. Чтобы подчеркнуть: столбец «КЛИЕНТЫ. ИМЯ_КЛИЕНТА’ не содержится ни в агрегатной функции, ни в предложении GROUP BY. Следуйте указаниям, которые неявно дает ошибка, и вы решите проблему.

Ответ №1:

Сообщение об ошибке достаточно ясно: group by предложение должно соответствовать select . Некоторые базы данных достаточно умны, чтобы понимать, что имя клиента функционально зависит от его идентификатора, и не требуют, чтобы вы вводили имя в group by — но не SQL Server.

Кроме того, вам нужно рассчитывать на то, что поступает из таблицы left join ed, если вы хотите 0 для клиентов без бронирований.

Рассмотрим:

 select c.customer_id, c.customer_name, count(ab.customer_id) as [number of accomm slots]
from customers c
left join  accommodation_bookings ab on c.customer_id = ab.customer_id
group by c.customer_id, c.customer_name
  

Я бы сделал один шаг вперед и предварительно агрегировал в подзапросе. Обычно это более эффективно:

 select c.customer_id, c.customer_name, coalesce(ab.cnt, 0) [number of accomm slots]
from customers c
left join (
    select customer_id, count(*) cnt
    from accommodation_bookings 
    group by customer_id
) ab on c.customer_id = ab.customer_id
  

Вы также можете выразить это с помощью коррелированного подзапроса или бокового соединения:

 select c.customer_id, c.customer_name, ab.*
from customers c
outer apply (
    select count(*) [number of accomm slots]
    from accommodation_bookings ab
    where c.customer_id = ab.customer_id
) ab
  

Это позволило бы использовать индекс on accommodation_bookings(customer_id) (который уже должен быть там, если вы настроили внешний ключ).

Примечание: не используйте одинарные кавычки для идентификаторов — они предназначены для буквенных строк. В SQL Server вместо этого используйте квадратные скобки.