All of the love we left behind watching the flashbacks intertwine. I think our lives have just begun.
Народ, помогите, пожалуйста, сформировать запрос.

У меня есть две таблицы: в одной списки всех комнат гостиницы, в другой - информация о посетителях, датах заезда и отъезда и комнатах, которые они занимают. Таблицы связаны ключом RoomID. Дело в том, что могут быть заняты не все комнаты, то есть вторая таблица содержит информацию только о тех комнатах, что заняты.

А теперь смысл запроса: необходимо вывести список всех свободных на заданную дату комнат.
Запрос, который я приведу ниже, выводит список тех комнат, которые заняты, но не на то число, которое я указываю. А нужно, чтобы он выводил список всех свободных комнат плюс те, что заняты, но на другую дату:



Такое ощущение, что запрос полностью игнорирует содержимое таблицы Rooms. Что с этим делать?

@темы: Вопрос, База данных, MS SQL

Комментарии
04.12.2010 в 13:11

Homo homini lupus est!... quam qualis sit non novit.
Предлагаю вот такой вариант.

ALTER PROCEDURE GetFreeRoomsOnDate
@Date datetime
AS
BEGIN
SELECT r.RoomID
FROM Rooms r JOIN Visitors v ON r.RoomID=v.RoomID
WHERE
v.RoomID NOT IN (SELECT RoomID FROM Visitors
WHERE @Date BETWEEN v.ArriveDate AND v.DepartDate)
END

Ну и как один из вариантов написать туда условие еще типа "and v.ArriveDate< @Date"
05.12.2010 в 00:23

чтобы лучше вам помочь все таки лучше приведите полное описания таблиц с комментариями
05.12.2010 в 00:43

All of the love we left behind watching the flashbacks intertwine. I think our lives have just begun.
Veshchiy, увы, он опять выводит только данные из таблицы Visitors.
fess2007, я попробую.

Таблица Visitors.
В ней содержатся следующие столбцы (я напишу только те, что нам будут нужны): ID посетителя, дата заселения посетителя в гостиницу, дата выселения и номер комнаты, которую он занимает.
Вот скриншот инфы, которая забита в таблицу:
читать дальше

Таблица Rooms.
В ней 3 столбца: ID комнаты, тип (обычный или люкс) и стоимость в сутки.
Скриншот таблицы:
читать дальше

Как вы можете видеть, в таблице Visitors записаны не все комнаты, что есть в гостинице, а лишь те, что зарезервированы. А запрос должен выдавать все свободные комнаты, а не только те, что в резерве не попали в указанную нами дату.
05.12.2010 в 19:00

т.е. исходя из прочитанного нам нужно
1) выбрать из таблицы Visitors все комнаты которые не заняты на определенную дату
2) добавить к запросу данные из таблицы rooms которых нет в таблице Visitors в поле RoomID

если я сформулировал правильно то первую часть запроса вы уже написали, осталось добавить вторую



и полный запрос будет выглядеть


05.12.2010 в 19:14

All of the love we left behind watching the flashbacks intertwine. I think our lives have just begun.
fess2007, Боже мой, вы гений! Запрос заработал! Спасибо Вам огромное, вы спасли мой курсовик! :beg:
05.12.2010 в 20:00

Abigail

к сожалению до гениальности мне далеко, а вообще... если ничего не напутал то этот запрос можно написать немного проще


05.12.2010 в 20:18

All of the love we left behind watching the flashbacks intertwine. I think our lives have just begun.
fess2007, оооо, этот код мне больше нравится)) спасибо! Все работает как часы! :beg:
05.12.2010 в 20:24

All of the love we left behind watching the flashbacks intertwine. I think our lives have just begun.
А, стоп, стоп! Есть одна проблема - если в списке Visitors одна и та же комната записана на несколько дат, то она все равно выводится, даже если одна из дат попадает в указанную дами дату. Как можно решить эту проблему?
05.12.2010 в 20:31

приведите пример если можно

это типа если в комнате живут 2 человека с одними и те ми же датами ?
05.12.2010 в 20:39

All of the love we left behind watching the flashbacks intertwine. I think our lives have just begun.
fess2007, нет, если два разных человека живут в этой комнате, сначала один с какой-то даты по другую, а потом второй - после того, как первый благополучно выселился.
Вот так например:

05.12.2010 в 21:26

туплю под вечер, вроди так.. но если что опять упустил то пишите.


05.12.2010 в 21:49

All of the love we left behind watching the flashbacks intertwine. I think our lives have just begun.
fess2007, ммм, а для второго варианта кода это можно реализовать как-то? Потому что я решила использовать его - как оказалось, первый код выводит не то, что нужно.



Тут DISTINCT проблему не решил(
05.12.2010 в 21:55

а чем тот код что я последним дал не подходит ?
05.12.2010 в 22:01

All of the love we left behind watching the flashbacks intertwine. I think our lives have just begun.
fess2007, сначала все казалось правильным, а когда я начала сверять номера комнат, получилось, что код не выводит все комнаты, попавшие в таблицу Visitors.
05.12.2010 в 22:08

так давайте все таки определим постановку задачи.
вам нужно чтобы на какую то конкретную дату выдавался список комнат которые свободны, так ?

в каких ситуациях вот этот код не отрабатывает ?


05.12.2010 в 22:31

All of the love we left behind watching the flashbacks intertwine. I think our lives have just begun.
fess2007, стоп. Теперь работает как надо О__о
Он даже не выводит комнаты, которые повторяются.
Уфф... ладно, даже знать не хочу, почему раньше это не работало. Спасибо!

Слушайте, у меня тут еще 5 запросов несделанных, если у меня будут вопросы, можно я буду писать вам в личку?
05.12.2010 в 22:47

можете попробовать, но сегодня вам повезло что я смог вам помочь, я сейчас в командировке и достаточно плотно занят, на будущее было бы неплохо чтобы высылали сразу свою базу, чтоб не тратить время на создание таблиц и подготовку тестовых данных
05.12.2010 в 23:12

All of the love we left behind watching the flashbacks intertwine. I think our lives have just begun.
fess2007, о, спасибо! С пересылкой базы не проблем - все равно курсач, так что боятся за конфиденциальность нет смысла)) а там посмотрим как вам удобнее будет.

И раз уж пока еще вы свободны, может быть найдете время на еще один вопрос? Та же таблица Visitors, те же столбцы. И нужно определить ближайшую дату освобождения номера.

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



Но есть одна проблема - @Visitor не задается, он должен перебирать из всех и выбирать оптимум. Вот этот вариант кода:



выдает ошибку "Cannot perform an aggregate function on an expression containing an aggregate or a subquery." А как еще взять минимум у функции DATEDIFF я не знаю.
05.12.2010 в 23:39

По сути, мы будем сравнивать разницу между сегодняшней датой и DepartDate и выбирать минимальную.

не все так наверное просто - DATEDIFF в случае если DepartDate меньше чем текущая дата вернет положительное число, этот номер нам тоже подходит или все таки берем только те которые "еще" освободятся а не "уже" освободились
05.12.2010 в 23:50

All of the love we left behind watching the flashbacks intertwine. I think our lives have just begun.
fess2007, упс, вы правы. Это я действительно упустила. Тогда изначально придется сделать такое условие: DepartDate >= Getdate() и работать уже только с ними.
05.12.2010 в 23:51

т.е. те номера что уже освободились нам не нужны, и мы ищем только те что еще освободятся ?
05.12.2010 в 23:54

вроди бы так



определяет комнату и визитера из нее которая освободится раньше всех.

я спать если что пишите, завтра вечером может быть помогу если получиться
05.12.2010 в 23:59

All of the love we left behind watching the flashbacks intertwine. I think our lives have just begun.
fess2007, ну да, в спецификации стоит "ближайшая дата освобождения", так что скорее всего нас интересуют именно занятые номера.
По поводу кода: DATEDIFF(DD,DD,@Todaydate) - второе DD - откуда оно берется? SQL Server выдает ошибку.
И еще mindays - что это?
06.12.2010 в 00:08

DD-DepartDate
mindays - просто алиас который означает max((DATEDIFF(DD,DD,@Todaydate))) из внутреннего подзапроса
06.12.2010 в 00:21

All of the love we left behind watching the flashbacks intertwine. I think our lives have just begun.
fess2007, а, это типа моего сокращения r или v у таблиц, так?
Ух ты, работает! Круто! У меня как раз есть похожий на этот запрос, так что теперь можно считать, что я сделала их оба)
Спасибо огромное, вы так мне помогли! :friend: