CASE выражение "отсутствует ключевое слово" - PullRequest
0 голосов
/ 19 ноября 2018

В настоящее время я пытаюсь выполнить приведенный ниже оператор 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 голосов
/ 19 ноября 2018

Вы комбинируете элементы 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

Внутренний запрос должен получить все необходимые столбцы, доступные во внешнем запросе, а также любые вычисления, которые вы не хотите повторять,Внешний запрос может затем ссылаться на любой из них, включая псевдоним, который вы назначаете для любых вычисляемых значений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...