CREATE TABLE #Hotels
( HotelID int, HotelName varchar(10), HotelAddress varchar(10), HotelCity varchar(10), HotelState varchar(10), HotelPostalCode varchar(10))
CREATE TABLE #Reservation
(
ReservationID int, GuestID int, RoomID int, CheckinDate datetime, NumberofNights int
)
CREATE TABLE #Room
(
RoomID int, HotelID int
)
INSERT INTO #Hotels (HotelID,HotelName) VALUES (1,'A')
INSERT INTO #Hotels (HotelID,HotelName) VALUES (2,'B')
GO
INSERT INTO #Reservation (ReservationID,GuestID,RoomID,CheckinDate,NumberofNights)
VALUES (1,1,1,'2016-01-05',5)
INSERT INTO #Reservation (ReservationID,GuestID,RoomID,CheckinDate,NumberofNights)
VALUES (2,2,1,'2016-08-05',3)
INSERT INTO #Reservation (ReservationID,GuestID,RoomID,CheckinDate,NumberofNights)
VALUES (3,3,1,'2016-06-05',2)
INSERT INTO #Reservation (ReservationID,GuestID,RoomID,CheckinDate,NumberofNights)
VALUES (4,1,1,'2016-01-12',1)
INSERT INTO #Reservation (ReservationID,GuestID,RoomID,CheckinDate,NumberofNights)
VALUES (5,2,1,'2016-08-18',8)
INSERT INTO #Reservation (ReservationID,GuestID,RoomID,CheckinDate,NumberofNights)
VALUES (6,3,1,'2016-06-30',7)
INSERT INTO #Reservation (ReservationID,GuestID,RoomID,CheckinDate,NumberofNights)
VALUES (1,1,2,'2016-02-01',5)
INSERT INTO #Reservation (ReservationID,GuestID,RoomID,CheckinDate,NumberofNights)
VALUES (2,2,2,'2016-02-06',3)
INSERT INTO #Reservation (ReservationID,GuestID,RoomID,CheckinDate,NumberofNights)
VALUES (3,3,2,'2016-02-09',2)
INSERT INTO #Reservation (ReservationID,GuestID,RoomID,CheckinDate,NumberofNights)
VALUES (4,1,2,'2016-04-03',1)
INSERT INTO #Reservation (ReservationID,GuestID,RoomID,CheckinDate,NumberofNights)
VALUES (5,2,2,'2016-04-07',8)
INSERT INTO #Reservation (ReservationID,GuestID,RoomID,CheckinDate,NumberofNights)
VALUES (6,3,2,'2016-04-05',7)
INSERT INTO #Reservation (ReservationID,GuestID,RoomID,CheckinDate,NumberofNights)
VALUES (1,1,3,'2016-07-01',15)
INSERT INTO #Reservation (ReservationID,GuestID,RoomID,CheckinDate,NumberofNights)
VALUES (2,2,3,'2016-11-06',2)
INSERT INTO #Reservation (ReservationID,GuestID,RoomID,CheckinDate,NumberofNights)
VALUES (3,3,3,'2016-11-09',9)
INSERT INTO #Reservation (ReservationID,GuestID,RoomID,CheckinDate,NumberofNights)
VALUES (4,1,3,'2016-12-03',8)
INSERT INTO #Reservation (ReservationID,GuestID,RoomID,CheckinDate,NumberofNights)
VALUES (5,2,3,'2016-06-07',10)
INSERT INTO #Reservation (ReservationID,GuestID,RoomID,CheckinDate,NumberofNights)
VALUES (6,3,3,'2016-04-05',2)
INSERT INTO #Room VALUES (1,1)
INSERT INTO #Room VALUES (2,1)
INSERT INTO #Room VALUES (3,2)
而“魔法”就在这里
SELECT HotelName, MONTH(re.CheckinDate) as Month, COUNT(*) as TotalArrivals, AVG(CAST(re.NumberofNights as decimal(22,6) )) AS Avg
FROM #Hotels h
join #Room r on r.HotelID = h.HotelID
join #Reservation re on re.RoomID = r.RoomID
GROUP BY h.HotelID, HotelName, MONTH(re.CheckinDate)
您需要做的是使用选择,并按 HotelID 和 MONTH(re.CheckinDate) 分组,这将为您提供一个月的基本行(对于每个酒店,您将获得 12 行)。使用 COUNT(*) 将获得特定酒店一个月的所有记录,即到达总数,使用 Avg(NumberofNights) 将获得平均晚数。
我还使用 CASt(re.NumberofNights as decimal(22,6)) 因为如果 NumberofNights 是一个 int (我假设是这样),avg 也会返回一个 int 所以对于 3 次到达和 10 晚它会返回 3 不3.333333。
希望对你有帮助!