SQL计数avabiles间隔间的房间数

SQL计数avabiles间隔间的房间数,sql,Sql,我正在做一个酒店预订模块,几天后我就累了 Tables +++++++++++++++++++++++++++++++ rooms bookings ======== ============= room_id b_id avabile_rooms b_room_id check_in check_out b_room

我正在做一个酒店预订模块,几天后我就累了

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_房间/b_房间

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 >= ?)
)
我还不知道如何获取房间id/房间号 附言:我做了深入的搜索,但没有找到一个考虑到房间数量的解决方案。
谢谢。

以下是我的做法:

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
我将您的rooms表重命名为room_类型,如注释中所述,并根据需要重命名了列

这将取可用房间的数量,并减去与所选日期范围有任何重叠的所有预订,我相信这就是您想要的

根据您的业务规则,您可能需要:

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

我有一个关于餐桌室设计的问题。它有两列-ROOM\u ID,这是有意义的,然后第二列是AVAILABLE\u ROOMS。它有什么用途?就RROM_ID表示一个房间而不是多个房间而言,在该表中没有其他列的意义,尤其是存储可用房间的numebr。我是不是遗漏了什么?你需要今天的空房吗?是固定日期还是日期范围?@MilenPavlov:日期范围是selected@Incognito当前位置你说得对,这里有点乱,我刚才看到了。实际上,桌子房间应该称为房间类型,这样会更清楚。这是因为在一家酒店里,一种类型的房间可能会更多。可能最好添加一个单独的会议室类型。唯一的问题是不在预订表中的可用会议室,因此我添加了条件或为空,但现在我获得了未预订会议室的可用会议室=空。有没有办法将此值从sql查询更改为0?谢谢你说得对。我已经编辑了答案来处理没有预订的房间类型。