首页 > 解决方案 > CASE 表达式“缺少关键字”

问题描述

我目前正在尝试运行下面的 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 仪表板

标签: sqloracle

解决方案


您正在将 an 的元素IF与简单和搜索的case 表达式语法相结合。您的列别名上还有一个表别名前缀,这是不允许的。

你可以这样做:

   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子句将返回数字,而 while'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

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


推荐阅读