Как вернуть значение, используя CASE, DECODE и / или NVL
У меня есть проблемы с этим. Мне нужна формула, которая даст мне реальный результат независимо от того, являются ли значения NULL и / или 0. См. Следующее;
SELECT
[...columns...],
(NVL(SUM(table1.qty_rtnd), 0) + NVL(SUM(table1.qty_defective), 0)) / CASE (NVL(table1.sales, 0)) WHEN 0 THEN 1 END AS six_wk_pct_defective,
[...more columns...]
Значения в этом конкретном случае:
table1.qty_rtnd = NULL
table1.qty_defective = 7
table1.sales = 560
Если оператор CASE отсутствует в этой формуле, а делитель равен 0, Oracle SQL Developer возвращает ошибку, сообщая, что я не могу делить на ноль. Это нормально, но когда я пытаюсь применить оператор CASE к части дивиденда в этой формуле, поле в результате запроса равно NULL, когда этого не должно быть (в данном конкретном случае математика делает его равным 0,0125),
Что я делаю неправильно? Как я могу использовать CASE, NVL, DECODE или любые другие функции для решения этой проблемы?
Спасибо,
-Муравей
ОБНОВИТЬ:
Для тех, кто ищет ответ. Один был предоставлен кем-то, кто является следующим;
SELECT (NVL (qty_rtnd, 0) + NVL (qty_defective, 0)) / NVL (NULLIF (sales, 0), 1) FROM table1
2 ответа
Как насчет
SELECT (NVL (qty_rtnd, 0) + NVL (qty_defective, 0)) / NVL (sales, 1) FROM table1
или же
SELECT (NVL (qty_rtnd, 0) + NVL (qty_defective, 0)) / NVL (NULLIF (sales, 0), 1) FROM table1
для защиты продаж =0
Довольно сложно понять, что вы спрашиваете здесь, так как вы не предоставили нам контрольный пример. Например, вы не сказали нам, какие значения имеют различные столбцы. Вы сказали нам, что, по-видимому, желаемый результат равен 0,0125, но, не зная, какие данные мы должны использовать, мы немного слепы.
Если единственной проблемой является ваш знаменатель, я подозреваю, что вы хотите, чтобы знаменатель был
CASE WHEN NVL( table1.sales, 0 ) = 0
THEN 1
ELSE table1.sales
END
Если это предположение неверно, пожалуйста, помогите нам, опубликовав воспроизводимый контрольный пример.