Запрос на получение доступных комнат из инвентаря - PullRequest
0 голосов
/ 30 декабря 2018

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

Предположим, что пользовательский поиск состоит из следующих значений:

Идентификатор региона: 1 (например, Дубай) Дата заезда: 31-12-2018 и Дата оформления: 01-01-2019 (Он должен находиться в пределах valid_from и valid_to таблицы room_rate_types и не должен находиться в таблице from_date и to_date таблицы room_rate_type_blackout_dates; он не должен находиться в таблице from_date и to_date комнаты room_rate_type_booked_dates, а если он находится в таблице room_rate_tate_ates_edзабронированные (таблица room_rate_type_booked_dates) номера из столбца доступности таблицы room_types)

взрослый 1, ребенок 2, младенец 0: это должно быть в таблице rooms_occupancy

Мой поиск зависит от следующих таблици соответствующие им столбцы указаны в скобках:

свойства (region_Id), комнаты, rooms_occupancy (для взрослых, детей и младенцев), room_rate_types (доступность, valid_from и valid_to), room_rate_type_blackout_dates (From_date to To_Date), room_rate_type_booked_dates (booking Id, From_date и to_Date)

properties ( stores the general details of the property)
  pk property_id(primary key)
  region_id (id of the region)
  property_name


rooms ( stores the general details of the rooms)
  pk room_id(primary key)
  fk rooms_occupancy_id (the combination of the occupancies associated with the room)

rooms_occupancy  ( stores the general details of the combination of the 
                   occupancies in a single room)
  pk room_occupancy_id(primary key)
  fk room_id(foreign key that references the room table)
  adult,
  child,
  infant

room_rate_types (stores of the general details of the rates per room)
  pk rate_id(primary key)
  valid_from, 
  valid_to, 
  available_rooms
  fk room_id


room_rate_type_blackout_dates (stores the black out dates per rate)
  pk rate_blk_date_id (primary key)
  from_date, 
  to_date, 
 fk  rate_id (rate_id of the room_rate_types table)

room_rate_type_booked_dates (stores the booking info of the rate table)
  pk booking_id (primary key)
  from_date, 
  to_date, 
  fk rate_id (rate_id of the room_rate_types table)
  booked_rooms

Ожидаемые результаты должны быть такими, как указано ниже:

PropertyId, rateId, roomId, availblerooms 
1              1     1          5

1 Ответ

0 голосов
/ 30 декабря 2018

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

Настройка:

Create Table properties 
(
  property_id Int,
  region_id Int,
  property_name VarChar(25),
  room_id Int
)
Insert Into properties Values
(1,1,'property1',1)

Create Table rooms
(
  room_id Int,
  rooms_occupancy_id Int, --(the combination of the occupancies associated with the room)
)
Insert Into rooms Values
(1,1)

Create Table rooms_occupancy  --( stores the general details of the combination of the occupancies in a single room)
(
  room_occupancy_id Int,
  adult Int,
  child Int,
  infant Int
)
Insert Into rooms_occupancy Values
(1,1,2,0)

Create Table room_rate_types --(stores of the general details of the rates per room)
(
  rate_id Int,
  valid_from Date, 
  valid_to Date, 
  available_rooms Int,
  rate_blk_date_id Int, 
  booking_id Int
)
Insert Into room_rate_types Values
(1,'2018-12-31','2019-01-01',6,1,1)

Create Table room_rate_type_blackout_dates --(stores the black out dates per rate)
(
  rate_blk_date_id Int,
  from_date Date, 
  to_date Date, 
  rate_id Int
)
Insert Into room_rate_type_blackout_dates Values
(1,'2018-12-29','2018-12-30',1)

Create Table room_rate_type_booked_dates --(stores the booking info of the rate table)
(
  booking_id Int  IDENTITY(1,1) NOT NULL,
  from_date Date, 
  to_date Date, 
  rate_id Int,
  booked_rooms Int
)

Процедура:

Declare @From As Date = '2018-12-31'
Declare @To As Date = '2019-01-01' 

Declare @property As Int = 1
Declare @Region As Int = 1

Declare @roomratetypeid As Int = 1

If Exists 
(
   SELECT        
      p.property_id, 
      p.room_id,
      rate_id = (Select rate_id From room_rate_types Where rate_id = @roomratetypeid),
      Availablerooms = (Select available_rooms From room_rate_types Where rate_id = @roomratetypeid) - 1
   FROM 
      properties p INNER JOIN
      rooms r ON p.room_id = r.room_id INNER JOIN
      rooms_occupancy ro ON r.rooms_occupancy_id = ro.room_occupancy_id
   Where   
      p.property_id = @property And
      p.region_id = @Region And
      (  --Check if requested dates are available
         @From >= (Select valid_from From room_rate_types Where rate_id = @roomratetypeid) And
         @To  <= (Select valid_to From room_rate_types Where rate_id = @roomratetypeid)
      ) And
      Not Exists (Select booking_id From room_rate_type_booked_dates Where @From >= from_date And @To <= to_date) And
      Not Exists (Select rate_blk_date_id From room_rate_type_blackout_dates  Where @From >= from_date And @To <= to_date) 
)  --If NOT exists, create booking and display results and adjust the available rooms
Begin
      SELECT        
      p.property_id, 
      p.room_id,
      rate_id = (Select rate_id From room_rate_types Where rate_id = @roomratetypeid),
      Availablerooms = (Select available_rooms From room_rate_types Where rate_id = @roomratetypeid) - 1
   FROM 
      properties p INNER JOIN
      rooms r ON p.room_id = r.room_id INNER JOIN
      rooms_occupancy ro ON r.rooms_occupancy_id = ro.room_occupancy_id
   Where   
      p.property_id = @property And
      p.region_id = @Region And
      (  --Check if requested dates are available
         @From >= (Select valid_from From room_rate_types Where rate_id = @roomratetypeid) And
         @To  <= (Select valid_to From room_rate_types Where rate_id = @roomratetypeid)
      )
   Update room_rate_types Set available_rooms = (Select available_rooms From room_rate_types Where rate_id = @roomratetypeid) - 1;
   Insert Into room_rate_type_booked_dates Values (@From,@To,@roomratetypeid,1)
End
Else 
   Select 'Not Available';

Результат:

property_id room_id rate_id Availablerooms
1           1       1       5
...