Вы комбинируете элементы 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
Внутренний запрос должен получить все необходимые столбцы, доступные во внешнем запросе, а также любые вычисления, которые вы не хотите повторять,Внешний запрос может затем ссылаться на любой из них, включая псевдоним, который вы назначаете для любых вычисляемых значений.