0

RoomRateChange、RoomRateCotract、DisplayInventoryの3つのテーブルがあります

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にデータがある場合は、3番目のテーブル(DisplayInventory)のRoomRateChangeから説明値を追加する必要があります。それ以外の場合は、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日まで。

SQLServer2008を使用しています

前もって感謝します。

4

1 に答える 1

2

再帰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 FiddlewithDemoを参照してください。

再帰部分は、各部屋と料金の開始日/終了日のリストを取得します。

;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ます。

于 2013-02-07T10:14:29.390 に答える