2016-05-19 3 views
0

Мне нужна помощь с оператором Oracle SQL. Мне нужно сравнить три столбца различными способами и вернуть один номер.Использование DECODE для сравнения нескольких столбцов и возврата одного значения

Пример: Колонка A представляет собой нулевой & Колонка B является Нуль затем вернуться Колонка C Колонка B является NULL & Колонка C равна нулю, то Return Колонка A Колонка A представляет собой нулевой & Колонка C является нулевым, тогда Возврат Колонка B Колонка A - < Столбец B, затем колонка A

и так далее и так далее.

Я пробовал CASE/КОГДА/ELSE и DECODE (Обрезку. МЕРЕ работает нормально, когда я сравнение 3 колонки, если они НЕ NULL или я получаю 0.

Я нашел COALESCE (Инструкция NULLIF, и это отлично работало, за исключением тех случаев, когда у меня есть несколько столбцов со значениями OVER 0, оно всегда возвращает первое значение. Могу ли я также добавить «наименьшую» функцию в (или в конце) функции NULLIF, чтобы она, если 2 из столбцов NOT NULL, то сравнивать эти 2 и дать мне наименьшее значение

Желательные Результаты:.

desc  hrs cyc  days interval hrs/cyc/days 
============================================================ 
Task 1 72 0  0  72   hrs 
Task 2 2400 1200 2190 2400  hrs 
Task 3 600 0  180  600   hrs 
Task 4 0  500  120  500   cyc 
Task 5 0  0  30  30   day 

Кодирование, чтобы получить вышеупомянутые результаты в Business Intelligence/Web Intelligence выглядит следующим образом:

= If ([Remain Hours]=0 And [Remain Cycles] = 0) Then [Schedule Days] 
Else If ([Remain Cycles]=0 And [Remain Days]= 0) Then [Schedule Hours] 
Else If ([Remain Hours] = 0 And [Remain Days] = 0) Then [Schedule Cycles] 
Else If ([Remain Hours] = 0 And ([Remain Days] < [Remain Cycles]/6)) Then [Schedule Days] 
Else If ([Remain Hours] = 0 And ([Remain Cycles]/6 < [Remain Days] )) Then [Schedule Cycles] 
Else If ([Remain Hours] = 0 And ([Remain Cycles]/6 > [Remain Days] )) Then [Schedule Days] 
Else If ([Remain Cycles] = 0 And ([Remain Hours]/13 < [Remain Days])) Then [Schedule Hours] 
Else If ([Remain Cycles] = 0 And ([Remain Hours]/13 > [Remain Days])) Then [Schedule Days] 
Else If ([Remain Days] = 0 And ([Remain Hours]/13 < [Remain Cycles]/6 )) Then [Schedule Hours] 
Else If ([Remain Days] = 0 And ([Remain Hours]/13 > [Remain Cycles]/6 )) Then [Schedule Cycles] 
Else If (([Remain Hours]/13) < ([Remain Cycles]/6) And ([Remain Hours]/13 < [Remain Days]) ) Then [Schedule Hours] 
Else If (([Remain Cycles]/6 < [Remain Days]) And ([Remain Cycles]/6 < [Remain Hours]/13)) Then [Schedule Cycles] 
Else If (([Remain Days] < [Remain Cycles]/6) And ([Remain Days] < [Remain Hours]/13)) Then [Schedule Days] 
+0

Пожалуйста, после некоторых образцов данных и желаемого результат – Aleksej

+0

Можете ли вы описать большую проблему, которую вы пытаетесь решить? Я подозреваю, что это часть более крупного решения, где, если бы у нас была большая картина, мы могли бы предложить лучшее решение. –

+0

Да, я это сделаю. В основном я работаю в авиакомпании и создаю отчеты об обслуживании. Каждая задача обслуживания должна выполняться либо часами, циклами и/или днями этой задачи, которые когда-либо на первом месте. Эти значения хранятся в трех разных полях. Таким образом, задача A имеет все 3 поля, которые отслеживаются. Я знаю, что я могу преобразовать ЧАСЫ И ЦИКЛЫ в ДНИ, но мне нужно, чтобы они сравнивали все 3 столбца, ЕСЛИ ЛЮБОЙ НЕ НУЛЛ, и дайте мне наименьшее значение. – EMassey

ответ

0

Из того, что я понимаю, вы хотите, чтобы выбрать минимальное значение из всех 3-х колонок, но некоторые из столбцы могут быть нулевыми, а порядок значений в столбцах не обязательно возрастает.

Если предположить, что по крайней мере 1 столбец имеет ненулевое значение, то это будет работать для вас:

SELECT LEAST(COALESCE(COL_A, 2147483647), COALESCE(COL_B, 2147483647), COALESCE(COL_C, 2147483647)) 
FROM YOUR_TABLE 

2147483647 является максимально допустимым значением PLS_INTEGER. Предположительно, все ваши реальные значения будут намного меньше этого максимального значения, а функция LEAST вернет самое низкое значение в любом столбце.

У вас возникнет проблема, если все три столбца могут быть пустыми, но поскольку это приведет к возврату 2147483647. В этом случае, вы можете сделать DECODE игнорировать значение и вернуться NULL вместо:

SELECT DECODE(LEAST(COALESCE(COL_A, 2147483647), COALESCE(COL_B, 2147483647), COALESCE(COL_C, 2147483647)), 2147483647, NULL) 
FROM YOUR_TABLE 
+0

Спасибо за ваше предложение, к сожалению, оба оператора возвращают NULL для всего столбца. Любые другие предложения ??? – EMassey

Смежные вопросы