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?谢谢你说得对。我已经编辑了答案来处理没有预订的房间类型。