2016-04-21 91 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 *的別名*。無論如何,您無法在相同級別的查詢中引用列別名,但是在您使用它的位置沒有意義? –