“找不到FROM关键字”

时间:2018-03-21 17:00:52

标签: sql oracle

 SELECT distinct
   REPLACE(CM_NAME, '/', ' ') as CM_NAME,  
   TO_CHAR(Booking_Date,'MM/DD/YYYY') AS Booking_Date where Booking_Date = 
   '03/20/2018',
   sum(Air_Revenue) as TTL_AIRFARE,
   sum(Room_Revenue) as TTL_ROOM,
   sum(Car_Revenue) AS TTL_CAR,
   sum(Activity_Revenue) as TTL_ACTIVITY,
   0 as TTL_CRUISE

所以我试图做的是选择昨天的日期,但我一直收到这个错误,用to_char语句做这个的最有效的方法是什么

1 个答案:

答案 0 :(得分:2)

您发布的代码没有bind(Foo.class).toProvider(FooProvider.class)条款,但您​​说您还没有包含它。但是,它确实有一个from子句 - 它位于错误的位置。它还将日期与字符串进行比较,这不是一个好主意,因为它依赖于隐式转换和会话NLS设置。 (也许您认为它可以将固定字符串与您刚刚转换为字符串的日期进行比较 - 但事实并非如此,至少在同一级别的查询中,并且在这种情况下无论如何都会效率低下。)当你使用聚合函数时,你需要一个group-by子句......

看起来你想要:

where

或者如果你想要昨天的日期而不必指定它,你可以使用:

SELECT REPLACE(CM_NAME, '/', ' ') as CM_NAME,  
   TO_CHAR(Booking_Date,'MM/DD/YYYY') AS Booking_Date,
   sum(Air_Revenue) as TTL_AIRFARE,
   sum(Room_Revenue) as TTL_ROOM,
   sum(Car_Revenue) AS TTL_CAR,
   sum(Activity_Revenue) as TTL_ACTIVITY,
   0 as TTL_CRUISE
FROM your_table
WHERE Booking_Date = DATE '2018-03-20'
GROUP BY REPLACE(CM_NAME, '/', ' '),
   Booking_Date

这只会匹配WHERE Booking_Date = TRUNC(sysdate - 1) GROUP BY REPLACE(CM_NAME, '/', ' '), Booking_Date 正好在午夜的行。如果它实际上包括其他时间,那么你可以这样做:

Booking_Date

将包含一整天的数据。