2015-11-20 2 views
6

У меня есть эти три таблицы: enter image description hereSQL для наличия номеров отеля в ASP C#

С этой ЗЕЬЕСТ:

SELECT DISTINCT r.roomId,rt.roomTypeName,rt.roomTypeDesc,rt.roomTypePrice 
FROM Room r left join RoomType rt 
    on r.roomTypeId=rt.roomTypeId 
WHERE roomStatus='Online' 
    AND NOT EXISTS(
     SELECT 1 FROM Reservation b WHERE b.roomId = r.roomId 
      AND ('7/11/2015' BETWEEN b.checkInDate 
      AND b.checkOutDate OR '8/11/2015' BETWEEN b.checkInDate 
      AND b.checkOutDate OR ('7/11/2015'<= b.checkInDate AND '8/11/2015' >= b.checkOutDate))) 
order by rt.roomTypePrice 

Я получаю этот результат

enter image description here

Как может Я подсчитываю количество доступных номеров каждого типа комнаты, чтобы я мог использовать раскрывающийся список в [РЕЗУЛЬТАТ], чтобы разрешить пользователю выбрать количество, которое они хотят? (Подобное как веб-сайт Agoda.com.)

ответ

1
SELECT rt.roomTypeName, count(rt.roomTypeName) 
    FROM Room r left join RoomType rt 
    on r.roomTypeId=rt.roomTypeId 
    WHERE roomStatus='Online' 
     AND NOT EXISTS(
      SELECT 1 FROM Reservation b WHERE b.roomId = r.roomId 
      AND ('7/11/2015' BETWEEN b.checkInDate 
      AND b.checkOutDate OR '8/11/2015' BETWEEN b.checkInDate 
      AND b.checkOutDate OR ('7/11/2015'<= b.checkInDate AND '8/11/2015' >= b.checkOutDate))) 
    GROUP BY rt.roomTypeName 

Больше на GROUP BY:

http://www.w3schools.com/sql/sql_groupby.asp

Это в основном говорит: «дайте мне каждый roomTypeName в колонке 1 и количество всех записей, где roomTypeName не является нулевым в столбце 2 '

Это еще не отчетливо, но тогда использование GROUP BY гарантирует, что набор результатов «свернут» в различные значения roomTypeName, таким образом, c ount затем применяется к счету вхождений записей с этим значением roomTypeName.

+0

большое спасибо ... это работает – Xion

+0

Пожалуйста, не связывайтесь с W3Schools, так как это не надежный источник информации. Вместо этого ссылайтесь на источник информации, например на эту страницу: https://msdn.microsoft.com/en-us/library/ms177673.aspx –

+0

@atornblad - задавая уровень, на котором задан этот вопрос, я нахожу школы w3c гораздо более уместным. –

0

Ваша логика для определения доступности номера слишком сложна. Номер не доступен в течение периода, если начало периода меньше, чем дата окончания некоторой оговоркой и конец периода после даты начала этой оговорки в:

SELECT rt.roomTypeName, COUNT(*) 
FROM Room r left join 
    RoomType rt 
    on r.roomTypeId = rt.roomTypeId 
WHERE roomStatus = 'Online' AND 
     NOT EXISTS (SELECT 1 
        FROM Reservation b 
        WHERE b.roomId = r.roomId AND 
         '2015-11-07' < b.checkoutDate AND 
         '2015-11-08' >= b.checkinDate 
       ) 
GROUP BY rt.roomTypeName; 

Использование BETWEEN логики перекрытия указывает на чрезмерно сложный запрос на минимальная и потенциальная логическая ошибка (в большинстве случаев).

ПРИМЕЧАНИЕ. Я изменил даты на формат ISO YYYY-MM-DD. Я предполагаю, что они в ноябре.

Смежные вопросы