【问题标题】:SUM within CASE WHEN Statement in OracleOracle 中 CASE WHEN 语句中的 SUM
【发布时间】:2018-02-23 23:07:22
【问题描述】:

我有一个这样的查询,O_ID 数据类型是 VARCHAR,f_units 数据类型是 Number

我在下面做了以避免除数为零错误,当我这样做时,当我在语句中添加整个案例的总和时,我仍然收到错误 ORA-01476: divisor is equal to zero说功能太封闭了。

select O_ID,SUM(F_UNITS),
CASE WHEN SUM(F_UNITS) <> 0 THEN sum(cast(f_units as float)) / sum(cast(sum(f_units ) as float)) over (partition by O_ID) ELSE 0 END
from myfacttable

在这种情况下如何处理除数 0 错误?

【问题讨论】:

  • 你想做什么?在这里将较大的数字除以较小的数字似乎没有意义。例如。你得到了总和除以分区上的总和除以o_id。我想你想要反过来?
  • 我正在尝试做一个市场份额计算公式是O_ID的Total F_units / Total F_units,其中我的O_ID是我的出口,它就像每个出口的市场份额..,
  • 请编辑您问题中的 SELECT 语句,使其有效。您有一个未终止的 CASE 表达式 - CASE 没有 END。谢谢。
  • 另外你不能选择o_idsum(f_units)而不按o_id分组。但是添加它会改变您在 sum(cast(f_units as float)) / sum(etc) 表达式中尝试执行的任何操作的逻辑。一些测试数据会有很大帮助。
  • 标准模式是将除数表达式包装在nullif(yourdivisor,0) 中,这将返回无法计算值的空值。我会把它作为答案发布,但我不知道查询的目的是什么。

标签: oracle


【解决方案1】:

在您的代码中,您正在检查何时SUM(F_UNITS) &lt;&gt; 0,但您除以sum(cast(sum(f_units ) as float)) over (partition by O_ID),这是一个完全不同的值。

将您的条件子句更改为sum(cast(sum(f_units ) as float)) over (partition by O_ID) &lt;&gt; 0,您可能会有更好的运气。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-14
    • 2021-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多