#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 вместо этого используйте квадратные скобки.