2014-01-22 44 views
0

房間avabiles我正在一個酒店預訂模塊,幾天後我堆棧。SQL統計間隔

Tables 
+++++++++++++++++++++++++++++++ 

rooms    bookings 
========   ============= 
room_id   b_id 
avabile_rooms  b_room_id 
        check_in 
        check_out 
        b_rooms 

== ==哪裏 avabile_rooms - 客房數量avabile b_rooms =客房與此B_ID數預訂

Values needed 
++++++++++++++++++++++++++++++++ 
room_id and number_of_rooms_avabile foreach avabile room in interval A(check_in) - B(check_out) 

Current Query 
++++++++++++++++++++++++++++++++ 
SELECT r.* FROM rooms AS r WHERE r.room_id NOT IN 
(
    SELECT b.b_room_id FROM bookings AS b 
    WHERE (b.check_out >= ? AND b.check_in <= ?) 
    OR (b.check_out <= ? AND b.check_in >= ?) 
) 

現在我得到的avabile房間沒有考慮到avabile_rooms/b_rooms

The Unkown Query (I thik It needs to be something like this) 
++++++++++++++++++++++++++++++++ 
SELECT r.* FROM rooms AS r WHERE r.room_id IS IN 
(
    SELECT b.b_room_id FROM bookings AS b 
    OR b.b_id IS NULL 
    OR (b.check_out >= ? AND b.check_in <= ?) 
    OR (b.check_out <= ? AND b.check_in >= ?) 
) 

我沒有想出如何讓ROOM_ID/number_of_rooms_avabile P.S .:我進行了深入的搜索,但沒有找到考慮到房間數量的解決方案。 謝謝。

+0

我有表的房間設計一個問題。它有兩列 - ROOM_ID,這很合理,然後第二列是AVAILABLE_ROOMS。它的用途是什麼?只要RROM_ID表示一個房間而不多於一個房間,那麼在該表中沒有其他列的意義,特別是存儲「可用房間的數目」。我在這裏錯過了什麼嗎? – Incognito

+0

您是否只需要今天的可用空間(固定日期)或日期範圍? – Milen

+0

@MilenPavlov:對於將被選擇的日期範圍 – user2186504

回答

1

這裏是我會怎麼做:

select rt.room_type_id, available = rt.available_rooms - isnull(sum(b.b_rooms), 0) 
from room_types rt 
left join bookings b 
    on rt.room_type_id = b.b_room_type_id 
    and b.check_in <= @end_date 
    and b.check_out >= @start_date 
group by rt.room_type_id, rt.available_rooms 

我改名爲你的房間的表作爲在評論中討論room_types,並更名列適當。

這將需要可用房間的數量,並減去與選定日期範圍有重疊的所有預訂,我相信這是您想要的。

根據您的業務規則,您可以改爲想要這個:

where b.check_in < @end_date 
and  b.check_out > @start_date 
+0

唯一的問題是不在預訂表中的available_rooms,所以我添加了條件OR IS NULL,但現在我獲得了available_rooms = Null沒有預訂房間。有沒有辦法將此值更改爲0從SQL查詢?謝謝! – user2186504

+0

你是對的。我編輯了處理room_types的答案,沒有預訂。 – hook