【问题标题】:Total Number of Reservations by Hotel Name and Month按酒店名称和月份的预订总数
【发布时间】:2016-10-19 12:18:19
【问题描述】:

我正在尝试编写一个 SQL Server 脚本,该脚本按酒店名称和(入住)月份显示预订总数。任何帮助将不胜感激。

这是我正在寻找的输出类型:

HotelName          Month     TotalReservations
==============================================
Algonquin Hotel    June      300
Algonquin Hotel    July      275
Algonquin Hotel    August    295
The Four Seasons   June      485 
The Four Seasons   July      445
The Ritz-Carlton   June      ...

以下是一些相关的表格信息:

酒店:

HotelID(PK), HotelName, HotelAddress, HotelCity, HotelState, HotelPostalCode

预订:

ReservationID(PK), GuestID, RoomID(FK), CheckinDate, NumberofNights

ROOM(仅表连接需要):

RoomID(PK), HotelID(FK)

【问题讨论】:

  • 所以你已经想出点什么了吗?到目前为止你做了什么?
  • 如果预订从 6 月 30 日开始并持续 5 晚怎么办。那是6月份的1次预订吗?还是六月一个,七月一个?或者每晚算作 1 次预订;所以六月一个,七月四个?它有助于显示样本数据和所述样本数据的预期输出——正如@DavidG所说——请展示你的努力。
  • 谢谢,JiggsJedi!正如我所说,对于“月份”列,我将按入住日期进行,因此退房日期月份是否与入住日期月份不同并不重要。
  • 正如@DavidG 所说,在要求 SO 为您做之前,您有没有自己尝试过任何事情?
  • 您不想将 2015 年 1 月与 2016 年 1 月不同吗?

标签: sql sql-server count


【解决方案1】:

试试这个:

select h.hotelname , 
    DATENAME(MONTH, re.checkindate) as Month, 
    count(*) as TotalReservations
from room as r 
    inner join hotel as h on r.hotelid = h.hotelid
    inner join reservation as re on r.roomid  = re.roomid
group by h.hotelname, 
    DATENAME(MONTH, re.checkindate)

如果您有多年时间,请在查询的 selectgroup by 子句中替换这一行

CONCAT(DATENAME(MONTH, re.checkindate), ' ',  DATENAME(YEAR, re.checkindate))

【讨论】:

    【解决方案2】:
    select 
        h.hotelname, 
        datename(month,res.checkindate) as month , 
        count(*) reservations 
    from Hotel h 
    join room rm 
        on h.hotelid=rm.hotelid
    join RESERVATION res 
        on res.roomid=rm.roomid
    group by h.hotelname, datename(month,res.checkindate )
    

    【讨论】:

    • 请添加一些关于其工作原理的描述,而不是将其呈现为代码转储,以帮助提问者了解它在做什么。
    【解决方案3】:

    您可以加入表格,使用datename 函数获取月份名称,按酒店名称和月份分组并应用count

    SELECT   h.hotelname, DATENAME('m', checkindate), COUNT(*)
    FROM     hotel h
    JOIN     room  r ON h.hotelid = r.hotelid
    JOIN     reservation rs ON s.roomid = rs.roomid
    GROUP BY h.hotelname, DATENAME('m', checkindate)
    

    【讨论】:

    • 如果数据超过一年,则会中断(假设 OP 将 2016 年 1 月与 2015 年 1 月不同)
    猜你喜欢
    • 1970-01-01
    • 2016-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    • 1970-01-01
    • 2020-06-09
    相关资源
    最近更新 更多