我当前正在尝试运行以下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仪表板
答案 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
内部查询需要获取您希望在外部查询中使用的所有列,以及所有您不想重复的计算。然后,外部查询可以引用其中的任何一个,包括您分配给任何计算值的别名。