我需要查询一个小型酒店预订系统,并且需要一个查询来帮助您获取在特定日期可用的房间以及该房间的总费用。
该表如下所示:
+--------+------------+-------+--------+-------+------------------+
| RoomId | Date | ResID | Rate | Tax | DailyCleaningFee |
+--------+------------+-------+--------+-------+------------------+
| 1 | 2019-01-01 | 0 | 100 | 0.130 | 30 |
+--------+------------+-------+--------+-------+------------------+
ResID确定房间是否在某些日期预订。 0正在提供房间。 我想查询特定类别的2晚住宿的所有可用房间,它还应该返回该房间的总房价,包括清洁费和税费,生成的表格如下:
+---------+------------+
| RoomId | TotalRate |
+-------- +------------+
如果我要查询我的桌子2019年2月2日和2019年1月3日晚上,它还应排除Tax为空和/或费率设置为0的记录。查询什么看起来像什么?
非常感谢我能获得的任何帮助。 谢谢!
编辑: 我在表的示例中添加了DB Fiddle链接。
答案 0 :(得分:-1)
您的问题缺少一些信息,无法准确回答。但是我想我可以帮助您了解您的查询应如何获得期望的结果。见下文。
SELECT DISTINCT
t1.RoomId AS RoomId,
(((t1.Rate + t1.DailyCleaningFee) * (1.0 + t1.Tax)) + ((t2.Rate + t2.DailyCleaningFee) * (1.0 + t2.Tax))) AS TotalRate -- total rate has been the sum of each day rate + tax
FROM (
SELECT h.*
FROM `Hotel` h
WHERE h.Date = '2018-12-02' -- your first date goes here
AND h.ResID = 0 AND h.Tax IS NOT NULL AND h.Rate > 0
) t1
INNER JOIN (
SELECT h.*
FROM `Hotel` h
WHERE h.Date = '2018-12-03' -- your second date goes here
AND h.ResID = 0 AND h.Tax IS NOT NULL AND h.Rate > 0
) t2 ON t1.RoomId = t2.RoomId
之所以可行,是因为对于您要搜索的每个日期(这里提到了两天),您都需要进行内部查询,然后通过RoomId
将所有内容合并在一起,以收集所有提供的日期。之后,只有您才能计算最终汇率。
您可能需要修改未明确提及的税收计算公式。
编辑:(2018-12-01)
以上查询仅在两天内明确有效。
要计算任意连续天数的总费率,您可以使用以下查询。
SELECT
t1.RoomId AS RoomId,
ROUND(SUM(t1.DailyRate), 2) AS TotalRate
FROM (
SELECT
h.RoomId,
((h.Rate + h.DailyCleaningFee) * (1.0 + h.Tax)) AS DailyRate
FROM Hotel h
WHERE
h.ResID = 0
AND h.Tax IS NOT NULL
AND h.Rate > 0
AND h.Date >= '2018-12-02' AND h.Date <= '2018-12-04'
) t1
GROUP BY
t1.RoomId
HAVING
COUNT(*) >= DATEDIFF('2018-12-04', '2018-12-02') + 1;
请注意,日期包含两个边界。用您的日期参数替换硬编码的日期。
在HAVING
子句中,我们检查单个房间是否有连续的整天可用,并且仅对其进行过滤。
根据@Strawberry,这可能不是将房费存储在一种给定表中的有效方法。您可能需要稍微更改架构以使其获得更高的性能。