想要获取记录数

问题描述 投票:0回答:2

我总共有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
sql inner-join
2个回答
0
投票
  • 您可以交叉连接日历日期和酒店资源来获取日期和酒店的所有组合。

  • 然后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;

输出

enter image description here


0
投票

首先创建您想要的结果行。即:酒店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;
© www.soinside.com 2019 - 2024. All rights reserved.