CASE表达式“缺少关键字”

时间:2018-11-19 18:41:40

标签: sql oracle

我当前正在尝试运行以下SQL语句,并陷入case表达式中。我试图在这里解决其他问题,但是没有运气。运行以下内容时出现错误是“缺少关键字”

SELECT
   A.EQNO, A.ITEMNO, A.AVG_CYCLE, A.MFG_TYPE, A.ACTCAV, A.STDCAV, 
   A.ORIG_WO_QTY, A.TOTAL_FLOOR_DISPO, A.ORIG_WO_QTY - A.TOTAL_FLOOR_DISPO,

这是我不确定的地方

   CASE A.ACTCAV 
     WHEN A.ACTCAV = 2 THEN 
       (3600 / A.AVG_CYCLE)*2 
   ELSE 
     WHEN A.ACTCAV = 1 THEN 
       (3600 / A.AVG_CYCLE) 
   ELSE 'UNKNOWN' 
   END A.ACTCAV   

这部分看起来不错

 FROM   V_RT_CYCLE_PART_COUNTS A 
 LEFT OUTER JOIN MFGCELL B ON A.MFGCELL = B.MFGCELL 
 LEFT OUTER JOIN EPLANT C ON B.EPLANT_ID = C.ID
WHERE  A.MFG_TYPE = 'AIP-BLWMLD'
ORDER BY A.MFG_TYPE

最后,是否可以获取A.ORIG_WO_QTY-A.TOTAL_FLOOR_DISPO / CASE函数的结果?

尝试从我创建的水晶报表中提取SQL和公式并将其放入BI仪表板

1 个答案:

答案 0 :(得分:4)

您正在将IF的元素与简单和搜索的case expression语法组合在一起。在列别名上也有一个表别名前缀,这是不允许的。

您可以执行以下操作:

   CASE A.ACTCAV
     WHEN 2 THEN 
       (3600 / A.AVG_CYCLE)*2 
     WHEN 1 THEN 
       (3600 / A.AVG_CYCLE) 
     ELSE 'UNKNOWN' 
   END AS ACTCAV    

   CASE 
     WHEN A.ACTCAV = 2 THEN 
       (3600 / A.AVG_CYCLE)*2 
     WHEN A.ACTCAV = 1 THEN 
       (3600 / A.AVG_CYCLE) 
     ELSE 'UNKNOWN' 
   END AS ACTCAV    

在这两个变量中,中间的流浪ELSE已被删除(您不需要在WHEN子句之间使用,只需在结尾处保留默认值)。

但是,您的两个THEN子句将返回数字,而'UNKNOWN'是一个字符串,它将在运行时引发“ ORA-00932:不一致的数据类型”。您需要将默认值设置为数字,或者将数字明确转换为字符串。

  

是否可以获取A.ORIG_WO_QTY-A.TOTAL_FLOOR_DISPO / CASE函数的结果?

不在同一级别的查询中,除非您重复计算。您将需要使用内联视图或CTE,例如:

SELECT
   X.EQNO, X.ITEMNO, X.AVG_CYCLE, X.MFG_TYPE, X.ACTCAV, X.STDCAV, 
   X.ORIG_WO_QTY, X.TOTAL_FLOOR_DISPO, X.ORIG_WO_QTY - X.TOTAL_FLOOR_DISPO,
   X.NEW_ACTCAV, (X.ORIG_WO_QTY - X.TOTAL_FLOOR_DISPO) / X.NEW_ACTCAV
 FROM (
    SELECT
       A.EQNO, A.ITEMNO, A.AVG_CYCLE, A.MFG_TYPE, A.ACTCAV, A.STDCAV, 
       A.ORIG_WO_QTY, A.TOTAL_FLOOR_DISPO,
       CASE A.ACTCAV
         WHEN 2 THEN 
           (3600 / A.AVG_CYCLE)*2 
         WHEN 1 THEN 
           (3600 / A.AVG_CYCLE) 
         ELSE 'UNKNOWN' 
       END AS NEW_ACTCAV
     FROM   V_RT_CYCLE_PART_COUNTS A 
     LEFT OUTER JOIN MFGCELL B ON A.MFGCELL = B.MFGCELL 
     LEFT OUTER JOIN EPLANT C ON B.EPLANT_ID = C.ID
    WHERE  A.MFG_TYPE = 'AIP-BLWMLD'
  ) X

内部查询需要获取您希望在外部查询中使用的所有列,以及所有您不想重复的计算。然后,外部查询可以引用其中的任何一个,包括您分配给任何计算值的别名。