繁体   English   中英

Sql MS-Access 中的语法错误

[英]Syntax error in Sql MS-Access

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

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

使用 DateDiff 函数datediff('d', checkindate, checkoutdate)确定每次预订的逗留时间(即天数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 子句中没问题,原样。 但收入需要汇总。 我希望您希望使用 SUM 聚合来汇总每种房间类型的所有收入值。 尝试这个...

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        $23,000.00
1000    F        $23,100.00
1000    S        $20,700.00
1111    D        $36,500.00
1111    F        $16,450.00
1111    S        $15,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 函数必须是聚合函数的一部分。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM