2016-04-21 82 views
-1

我有一个SELECT语句,它工作正常,直到CASE部分,我认为这只是一个语法错误和lead time位。我正在使用Oracle APEX。计算列中的CASE语句问题

我得到错误;

ORA-00923: FROM keyword not found where expected

select 
supplier.companyname as "Supplier", 
purchaseorder.orderdate as "Order Date", 
purchaseorder.duedate as "Due Date", 
popayment.datedelivered as "Delivered", 
(popayment.paymentdate - popayment.datedelivered) - 31 as paidontime, 

/* this is the same as the next one (this works fine) */ 
(popayment.datedelivered - purchaseorder.duedate) - 1 as deleiverylate, 

/* trying to advance the previous query (this does not work) */ 
popayment.datedelivered - purchaseorder.duedate -1, 
          case when "lead time" <0 then 'early' 
           when "lead time" >0 then 'late' 
           else 'on time' 
          end as "lead time"; 


from supplier, purchaseorder, suppliercontact, popayment 


where 
    purchaseorder.SUPPLIERCONTACTID2 = suppliercontact.suppliercontactid 
and 
    supplier.supplierid = suppliercontact.supplierid 
and 
    purchaseorder.purchaseorderid = popayment.purchaseorderid 

order by COMPANYNAME 

感谢所有帮助 危险布赖恩

+0

为什么在“提前期”之后有分号?那不应该在那里。 (并且与错误无关,但为什么不使用ANSI风格的联接呢?) –

+0

@DangerousTreacle能否在'lead time'<0'的情况下解释字段'lead time'? –

回答

1

删除;这是你想要的吗?

SELECT supplier.companyname        AS "Supplier", 
    purchaseorder.orderdate        AS "Order Date", 
    purchaseorder.duedate         AS "Due Date", 
    popayment.datedelivered        AS "Delivered", 
    (popayment.paymentdate - popayment.datedelivered) - 31 AS paidontime, 
    /* this is the same as the next one (this works fine) */ 
    (popayment.datedelivered - purchaseorder.duedate) - 1 AS deleiverylate, 
    /* trying to advance the previous query (this does not work) */ 
    CASE 
    WHEN popayment.datedelivered - purchaseorder.duedate -1 <0 
    THEN 'early' 
    WHEN popayment.datedelivered - purchaseorder.duedate -1 >0 
    THEN 'late' 
    ELSE 'on time' 
    END AS "lead time" 
FROM supplier, 
    purchaseorder, 
    suppliercontact, 
    popayment 
WHERE purchaseorder.SUPPLIERCONTACTID2 = suppliercontact.suppliercontactid 
AND supplier.supplierid    = suppliercontact.supplierid 
AND purchaseorder.purchaseorderid  = popayment.purchaseorderid 
ORDER BY COMPANYNAME 
1

你应该end as "lead time";

+0

好吧我删除了';'并得到这个错误'ORA-00904:“提前期”:无效标识符' – DangerousTreacle

+0

'提前期'不是一个实际的列,我试图计算另外两个'提前期' – DangerousTreacle

+0

@ DangerousTreacle - 做任何一个表都有一个名为“lead time”的列 - 作为小写引用的标识符吗?如果不是的话,你试图引用你自己给出case case *的别名*。无论如何,您无法在相同级别的查询中引用列别名,但是在您使用它的位置没有意义? –