Получить условные данные в третьей таблице, объединив данные из двух таблиц

У меня 3 таблицы: RoomRateChange, RoomRateCotract и DisplayInventory

RoomRateChange:

| RoomID|RateID|Description|RateDate
----------------------
|   101   |  701|   abc       | 2013-04-01 00:00:00.000|

RoomRateCotract:

| RoomID|RateID|           StartDate    |           EndDate      |Description
----------------------------------------------------------------------------------------
|   101   |  701|2013-04-01 00:00:00.000| 2013-04-30 00:00:00.000|null

DisplayInventory:

| RoomID|RateID|Description|RateDate
----------------------

Я застрял в ситуации. для конкретного RoomID, RateID и для конкретной даты, если у меня есть данные в RoomRateChange, тогда я должен добавить значение описания из RoomRateChange в третьей таблице (DisplayInventory), иначе я должен выбрать значение описания из таблицы RoomRateCotract.

Для вышеуказанного сценария вывод должен быть

DisplayInventory

| RoomID|RateID|Description|RateDate
----------------------
|   101   |  701|  abc     | 2013-04-01 00:00:00.000|
|   101   |  701|  NULL     | 2013-04-02 00:00:00.000|
|   101   |  701|  NULL     | 2013-04-03 00:00:00.000| 

и так далее до 30-го.

Я использую SQL Server 2008

Заранее спасибо.

0
nl ja de
Это не 3 даты ставок. Тарифные даты - это все даты между startdate и enddate. В таблице DisplayInventory будет 30 записей.
добавлено автор palak mehta, источник
Мне жаль. Это 30 апреля. :)
добавлено автор palak mehta, источник
@Bulat: Да для разных дат.
добавлено автор palak mehta, источник
Можете ли вы иметь несколько изменений в стоимости номера в номере RoomID/RateID?
добавлено автор Bulat, источник
В моем календаре нет 31 апреля, как вы его установили? о_О
добавлено автор Andrey Gordeev, источник

1 ответы

Кажется, вы можете использовать рекурсивный CTE для получения результата:

;with data (roomid, rateid, startdate, enddate, description) as
(
  select roomid, rateid, startdate, enddate, description
  from RoomRateCotract
  union all
  select roomid, rateid, dateadd(day, 1, startdate), enddate, description
  from data
  where dateadd(day, 1, startdate) <= enddate
)
-- insert into DisplayInventory
select 
  r.roomid, 
  r.rateid,
  case 
    when r.ratedate = d.startdate 
    then r.description else d.description end description,
  d.startdate RateDate
from data d
left join RoomRateChange r
  on d.roomid = r.roomid
  and d.rateid = r.rateid

См. SQL Fiddle with Demo .

Рекурсивная часть получит список дат начала и окончания для каждой комнаты и ставки:

;with data (roomid, rateid, startdate, enddate, description) as
(
  select roomid, rateid, startdate, enddate, description
  from RoomRateCotract
  union all
  select roomid, rateid, dateadd(day, 1, startdate), enddate, description
  from data
  where dateadd(day, 1, startdate) <= enddate
)
select *
from data

Затем, используя результат, вы присоединитесь к RoomRateChange , чтобы получить результат. Затем это можно было бы использовать для заполнения таблицы DisplayInventory .

2
добавлено
@Bulat Если я что-то не хватает, в OP они показывают только описание, когда дата существует в RoomRateChange , если она не показывает, что они показывают null .
добавлено автор Taryn, источник
@Bulat, вы правы, исправлены. Я пропустил это. благодаря
добавлено автор Taryn, источник
Просто нужно исправить , а затем r.description else null end description , поскольку в RoomRateCotract есть поле description .
добавлено автор Bulat, источник
Я читал: «иначе я должен выбрать значение описания из таблицы RoomRateCotract».
добавлено автор Bulat, источник
Не беспокойтесь, отличный ответ.
добавлено автор Bulat, источник
SqlCom.ru - Стиль жизни SQL
SqlCom.ru - Стиль жизни SQL
908 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только MS SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz). Предложения в @sql_ninja

SQL_Ninja
SQL_Ninja
340 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz)