Oracle 中 CASE WHEN 语句中的 SUM

Posted

技术标签:

【中文标题】Oracle 中 CASE WHEN 语句中的 SUM【英文标题】:SUM within CASE WHEN Statement in Oracle 【发布时间】: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) 中,这将返回无法计算值的空值。我会把它作为答案发布,但我不知道查询的目的是什么。 【参考方案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,您可能会有更好的运气。

【讨论】:

以上是关于Oracle 中 CASE WHEN 语句中的 SUM的主要内容,如果未能解决你的问题,请参考以下文章

oracle中的条件语句

SQL语句中case,when,then的用法

oracle如何在CASE WHEN ELSE语句中使用select语句?

case-when oracle sql的动态评估

oracle sql - 选择具有多个“case when”的语句并检查是不是包含文本

如何检查Case When Statement中的重复值