Sql MS-Access 中的语法错误

Syntax error in Sql MS-Access

我的问题:业主想知道到目前为止每家酒店每种房型产生的收入(即 where CheckOutDate < DATE())。

计算必须在SQL语句中完成。

使用 DateDiff 函数 datediff('d', checkindate, checkoutdate) 确定每次预订的入住时长(即天数),并将此值乘以房价。

您的输出格式应如下一页所示。您的总收入可能不同。请记住,收入金额可能每天都在变化,因为我们只想包括那些已完成的预订,而不包括当前或未来的预订。

select 
   room.hotelID, room.roomtype,
   datediff('d', Reservation.CheckOutDate, Reservation.CheckInDate) * ROOM_TYPE.RoomRate as Revenue 
from 
   Reservation 
inner join 
   Room on Room.hotelID = Reservation.HotelID 
inner join 
   ROOM_TYPE on ROOM_TYPE.RoomType = Room.roomtype 
group by 
   Room.HotelID, Room.roomtype;

我发现这里缺少语法错误语句。

如何解决 MS Access 中的这个错误?

使用 Group By 子句时,任何不属于分组的列都必须聚合。在您的例子中,Room.HotelID 和 Room.RoomType 是分组列。因此,它们在您的 SELECT 子句中没有问题,按原样。但 Revenue 需要汇总。我希望您会想要使用 SUM 聚合来汇总每种房间类型的所有 Revenue 值。试试这个...

select room.hotelID,
       room.roomtype,
       SUM( datediff(day,Reservation.CheckOutDate,Reservation.CheckInDate )*ROOM_TYPE.RoomRate) as Revenue 
from Reservation 
inner join Room on Room.hotelID=Reservation.HotelID 
inner join ROOM_TYPE on ROOM_TYPE.RoomType=Room.roomtype 
group by Room.HotelID, Room.roomtype;

您仍然应该学习如何使用查询生成器,但我认为括号应该如下所示:

select
    Room.HotelID, Room.roomtype,
    sum(
        datediff('d',Reservation.CheckOutDate,Reservation.CheckInDate) *
        ROOM_TYPE.RoomRate
    ) as Revenue 
from
    ((Reservation inner join Room on Room.hotelID = Reservation.HotelID)
    inner join ROOM_TYPE on ROOM_TYPE.RoomType = Room.roomtype)
group by
    Room.HotelID, Room.roomtype;

总而言之:

  1. 小心分组列和聚合
  2. 与其他一些系统不同,Access 在其 datediff 参数周围使用引号
  3. 连接嵌套需要括号

运行 下面针对您在 Access 2010 中的数据的查询产生了这个结果集:

hotelID roomtype Revenue
------- -------- ----------
1000    D        ,000.00
1000    F        ,100.00
1000    S        ,700.00
1111    D        ,500.00
1111    F        ,450.00
1111    S        ,300.00
SELECT
    rm.hotelID,
    rm.roomtype,
    Sum(DateDiff('d', rs.CheckInDate, rs.CheckOutDate) * rt.RoomRate) AS Revenue
FROM
    (
        ROOM AS rm INNER JOIN RESERVATION AS rs
        ON (rm.roomno = rs.RoomNo) AND (rm.hotelID = rs.HotelID)
    )
    INNER JOIN ROOM_TYPE AS rt
    ON rm.roomtype = rt.RoomType
WHERE rs.CheckOutDate < Date()
GROUP BY rm.hotelID, rm.roomtype;

在 MS Access 中,我们必须在 from 语句中的子句的括号 () 中提及。除此之外,datediff 函数必须是聚合函数的一部分。