3

1.) 列出迄今为止收到的每家酒店的收入,即 DepartureDate < NOW()。计算必须在 SQL 语句中完成。使用 DateDiff 函数确定每次预订的时长(即天数)并将该值乘以房价(不是折扣价)。在输出中包含酒店编号。

到目前为止,我已经尝试过了,但这是不对的,并且给了我 DateDiff 语句的聚合函数错误

SELECT ROOM.HotelNo, DateDiff("d", [ArrivalDate], [DepartureDate]) *  ROOM_TYPE.RoomRate AS TotalRevenue
FROM RESERVATION, ROOM_TYPE, ROOM
WHERE ROOM.RoomType = ROOM_TYPE.RoomType
AND RESERVATION.RoomNo = ROOM.RoomNo
AND DepartureDate > Now()
GROUP BY ROOM.HotelNo;

这是您可以查看表格的链接

关系表 <-- 链接

请帮我解决这个问题

4

2 回答 2

1

使用表达式Sum()DateDiff()避免“不包括指定的表达式……作为聚合函数的一部分”的抱怨。

SELECT
    ROOM.HotelNo,
    Sum(
        DateDiff(
                "d",
                [ArrivalDate],
                [DepartureDate]
            ) * ROOM_TYPE.RoomRate
        ) AS TotalRevenue

WHERE子句包括DepartureDate > Now(),我怀疑它会将结果过滤到尚未离开的那些。我想你想要<而不是>那里。

考虑使用INNER JOIN而不是使用WHERE子句来指定表中的行如何匹配。如果您可以从 Access 查询设计器的设计视图中构建此查询,那么设置连接将很容易。并且查询设计者在连接超过 2 个表时知道有关所需括号的规则……因此将生成使数据库引擎满意的 SQL。

于 2013-11-12T20:08:19.693 回答
0

正如engineersmnky指出的那样,您的DATEDIFF是错误的。它应该是 2 个参数,出发然后到达日期:

SELECT 
    ROOM.HotelNo, 
    DATEDIFF(RESERVATION.DepartureDate, RESERVATION.ArrivalDate) *  ROOM_TYPE.RoomRate AS TotalRevenue
FROM RESERVATION
JOIN ROOM ON 
    RESERVATION.RoomNo = ROOM.RoomNo
JOIN ROOM_TYPE ON
    ROOM.RoomType = ROOM_TYPE.RoomType
WHERE RESERVATION.DepartureDate > NOW()
GROUP BY ROOM.HotelNo;

我不确定你为什么在 DepartureDate 和 ArrivalDate 周围有括号,因为它们只是 RESERVATION 表上的列,对吗?

于 2013-11-12T19:25:04.383 回答