簡體   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