SQL Server 2008で複雑なクエリを実行しようとしています(少なくとも私にとっては複雑です)。ここにコードがあります。 @HotelAllotmentsセクションで複雑なSQLクエリのアドバイス:予約割り当てロジック
DECLARE @Hotels AS TABLE(
HotelID INT,
HotelName NVARCHAR(100)
);
DECLARE @HotelAllotments AS TABLE(
HotelID INT,
StartDate DATETIME,
EndDate DATETIME,
Allotment INT
);
DECLARE @Reservations AS TABLE(
ReservationID INT,
HotelID INT,
CheckIn DATETIME,
CheckOut DATETIME,
IsCanceled BIT
);
INSERT @Hotels VALUES(1,'Foo Hotel');
INSERT @Hotels VALUES(2,'Poo Hotel');
INSERT @HotelAllotments VALUES(1,'2011-01-01', '2011-02-01', 10);
INSERT @HotelAllotments VALUES(1,'2011-02-02', '2011-02-18', 7);
INSERT @HotelAllotments VALUES(1,'2011-02-19', '2011-05-18', 19);
INSERT @HotelAllotments VALUES(1,'2011-05-19', '2011-10-18', 30);
INSERT @HotelAllotments VALUES(2,'2011-05-19', '2011-10-18', 30);
INSERT @Reservations VALUES(100, 1, '2011-05-10','2011-05-24',0);
INSERT @Reservations VALUES(101, 1, '2011-05-18','2011-05-28',0);
INSERT @Reservations VALUES(102, 1, '2011-03-07','2011-03-19',0);
INSERT @Reservations VALUES(103, 1, '2011-08-29','2011-09-07',0);
INSERT @Reservations VALUES(104, 1, '2011-09-01','2011-09-07',1);
INSERT @Reservations VALUES(105, 1, '2011-09-01','2011-09-07',1);
with e as(
SELECT ReservationID as resid1, CheckIn as chin1, 1 as lvl
FROM @Reservations res1
WHERE res1.HotelID = 1
UNION ALL
SELECT ReservationID as resid2, DATEADD(DAY,1,stall.chin1) as chin2, 1
FROM @Reservations res2
INNER JOIN e stall ON stall.chin1 < res2.CheckOut
WHERE stall.resid1 = res2.ReservationID
)
SELECT tb.chin1, SUM(lvl)
FROM e tb
GROUP BY tb.chin1
ORDER BY tb.chin1 DESC
、開始と終了日は、あなたが見ることができるようにあります。割当は毎日行われます。私は行が以下のようなものであれば意味します。
INSERT @HotelAllotments VALUES(1,'2011-01-01', '2011-01-03', 10);
これはこれを意味します。
- IDが1である2011-01-01
- IDが1である2011-01-02
- IDがある1 10を有しているホテルの10割当を持つホテルの10割当を持つホテル割当on 2011-01-03
その後、2011-01-01と2011-01-03の間に予約を受けた場合、以下のようになります。
INSERT @Reservations VALUES(106, 1, '2011-01-01','2011-01-03',0);
状況は以下の通りです。
- IDが1であるホテルの予約後に残る9割当てが2011-01-01
- にIDが1であるホテル9割当が2011-01-02
- に予約した後に残っているましたidが1であるホテルが2011-01-03以上
に予約した後に残され割当を持って、私はいくつかの一時テーブルを作成し、いくつかの偽の値を挿入し、私は、クエリを試してみました。私はどこかで私を取得します(私はそれを呼び出す方法がわかりません。クエリーを実行する機会が の場合、必要な場所ではありません)。私がここに必要なのはそれです。
私はホテルが契約を結んでいるすべての日付と、受け取った予約後にその左の割り当てをリストする必要があります。ここに例があります。
HotelID Date Allotment
------- ---------- ---------
1 2011-01-01 9
1 2011-01-02 9
1 2011-01-03 10
1 2011-01-04 10
1 2011-01-05 10
これはどのように達成できますか?いくつかの彼らは最後の割当は、予約の最初の2日間奪われている理由だろうが、ないはず
EDIT
。最終日にホテルに一日宿泊していないからです。 S /彼は午前12時まで部屋を空にすべきです。したがって、最後の日に割り当ての使用はありません。
私はちょうどタイプミスを願っています、2011-01-01 - > 2011-03-01は3ヶ月ではなく2ヶ月と1日です。問題のいくつかの点では、あなたはyyyy-mm-dd(誰もが期待している)とyyyy-dd-mm(これはほんのわずかです)を転置しているようです。 –
@Aaron非常に良いキャッチ。それはちょうどタイプミスでした、それを修正しました。 – tugberk
私は、次のセクションではまだタイプミスがあると思います。「その後、それを受け取ったら...」同じ第1弾と第3弾は、同じ日付の異なる割り当てを示します(前のセクションの日付と一致しません) 。また、予約の最初の2日間は割当が取られた理由を説明するのは良いでしょうが、最後のものではありません。同じ予約にもっと日数があるからですか?だから予約で最後の日を除く毎日から配当が差し引かれますか?次の日に別の予約が始まる場合はどうなりますか? –