如何使用CASE,DECODE和/或NVL返回值

时间:2014-06-10 21:14:46

标签: sql oracle 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或任何其他功能来解决此问题?

谢谢,

-Ant

更新:

对于那些寻找答案的人。一个是由以下人员提供的;

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

2 个答案:

答案 0 :(得分:1)

怎么样

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

答案 1 :(得分:0)

由于您还未向我们提供测试用例,因此很难理解您在此问的内容。例如,您还没有告诉我们各个列的值。你告诉我们,显然,期望的结果是0.0125,但不知道我们应该使用什么输入,我们有点失明。

如果唯一的问题是你的分母,我怀疑你想要分母

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

如果猜测不正确,请通过发布可重复的测试用例来帮助我们。