Как вернуть значение с помощью 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

person aCarella    schedule 10.06.2014    source источник
comment
Вы смешиваете SUM и отдельные значения в одном запросе. Во-вторых, у вас есть примеры значений для qty_rtnd, qty_defective и sales?   -  person wolφi    schedule 11.06.2014
comment
СУММ не кажется проблемой, когда делитель этой формулы не равен 0. Я обновил этот пост примерами значений столбца.   -  person aCarella    schedule 11.06.2014
comment
Опубликованные вами образцы значений, похоже, не соответствуют ошибке, которую вы указывали на получение до добавления оператора CASE. Если table1.sales равно 560, не было бы причин для того, чтобы знаменатель был равен 0, и, следовательно, не было бы причин для возникновения ошибки деления на 0. Кроме того, если у вас есть одиночные значения, нет никаких причин использовать функцию SUM в вашем знаменателе.   -  person Justin Cave    schedule 11.06.2014


Ответы (2)


Как насчет

SELECT (NVL (qty_rtnd, 0) + NVL (qty_defective, 0)) / NVL (sales, 1) FROM table1

or

SELECT (NVL (qty_rtnd, 0) + NVL (qty_defective, 0)) / NVL (NULLIF (sales, 0), 1) FROM table1

для защиты продаж = 0

person wolφi    schedule 10.06.2014
comment
Это вызовет ошибку, если sales равно 0. Не зная, каковы фактические значения, трудно определить, является ли это реальной проблемой или нет. Но это потенциальная проблема. - person Justin Cave; 11.06.2014
comment
Второе решение, которое вы мне предоставили, сработало отлично. Спасибо! - person aCarella; 11.06.2014

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

Если единственная проблема заключается в вашем знаменателе, я подозреваю, что вы хотите, чтобы знаменатель был

CASE WHEN NVL( table1.sales, 0 ) = 0
     THEN 1
     ELSE table1.sales
 END

Если это предположение неверно, пожалуйста, помогите нам, опубликовав воспроизводимый тестовый пример.

person Justin Cave    schedule 10.06.2014
comment
Исходный пост был обновлен значениями для столбцов. Спасибо за помощь. - person aCarella; 11.06.2014