我总共有3张桌子。
日历数据、酒店资源、酒店资源预订。
在 CalendarData 中,我存储每个月的日期..下面我分享一些示例记录。
在 HotelResource 中我存储酒店名称,下面我分享一些示例记录。
在 HotelResourcesBookings 中,我使用 Date 和 HotelResourceId 存储预订数据,下面我分享一些示例记录。
在 HotelResourcesBookings 表中,我可以在同一天对同一酒店 ID 进行多次预订。您可以在下表中看到 hotelId 2 我有两个 12 月 5 日的预订。
所以我想要的是该日期的预订数量,例如我需要该日期的 2 次预订。
现在我已经以这种方式编写了查询,因此它将返回 12 月份的整个月份日期的数据以及预订 ID,现在在该查询中我想添加计数。
日历数据示例:
身份证 | 日期 |
---|---|
1 | 2024-12-01 00:00:00.000 |
2 | 2024-12-02 00:00:00.000 |
3 | 2024-12-03 00:00:00.000 |
酒店资源示例:
身份证 | 姓名 |
---|---|
1 | 酒店1 |
2 | 酒店2 |
酒店资源预订示例:
身份证 | 酒店ID | 日期 |
---|---|---|
1 | 1 | 2024-12-01 00:00:00.000 |
2 | 1 | 2024-12-02 00:00:00.000 |
3 | 2 | 2024-12-05 00:00:00.000 |
4 | 2 | 2024-12-05 00:00:00.000 |
我想要以下输出
日期 | 酒店ID | 姓名 | 酒店资源ID | 数 |
---|---|---|---|---|
2024-12-01 00:00:00.000 | 1 | 酒店1 | 1 | 1 |
2024-12-02 00:00:00.000 | 1 | 酒店1 | 2 | 1 |
2024-12-03 00:00:00.000 | 1 | 酒店1 | 空 | 0 |
2024-12-04 00:00:00.000 | 1 | 酒店1 | 空 | 0 |
2024-12-05 00:00:00.000 | 1 | 酒店1 | 空 | 0 |
2024-12-01 00:00:00.000 | 2 | 酒店2 | 空 | 0 |
2024-12-02 00:00:00.000 | 2 | 酒店2 | 空 | 0 |
2024-12-03 00:00:00.000 | 2 | 酒店2 | 空 | 0 |
2024-12-04 00:00:00.000 | 2 | 酒店2 | 空 | 0 |
2024-12-05 00:00:00.000 | 2 | 酒店2 | 3 | 2 |
2024-12-05 00:00:00.000 | 2 | 酒店2 | 4 | 2 |
您可以交叉连接日历日期和酒店资源来获取日期和酒店的所有组合。
然后LEFT JOIN Bookings 即可获得预订的分配情况。
按日期和酒店 ID 分区用于获取每个日期每家酒店的预订数量。
SELECT
cd.Date,
hr.Id AS HotelId,
hr.Name,
hrb.Id AS HotelResourceId,
COUNT(hrb.Id) OVER (PARTITION BY cd.Date, hr.Id) AS Count
FROM
CalendarData cd
CROSS JOIN
HotelResource hr
LEFT JOIN
HotelResourcesBookings hrb
ON cd.Date = hrb.Date
AND hr.Id = hrb.HotelId
ORDER BY
cd.Date, hr.Id, hrb.Id;
输出
首先创建您想要的结果行。即:酒店X天。交叉连接。然后外部连接您拥有的预订并汇总和计数。
with
days as
(
select date
from calendardata
where date >= datefromparts(:year, :month, 1)
and date < datefromparts(:year, :month + 1, 1)
)
select hr.id, hr.name, days.date, count(hrb.id)
from hotelresource hr
cross join days
left outer join hotelresourcesbookings hrb on hrb.hotel_id = hr.id
and hrb.date = days.date
group by hr.id, hr.name, days.date
order by hr.id, days.date;