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_id
和sum(f_units)
而不按o_id
分组。但是添加它会改变您在 sum(cast(f_units as float)) / sum(etc)
表达式中尝试执行的任何操作的逻辑。一些测试数据会有很大帮助。
标准模式是将除数表达式包装在nullif(yourdivisor,0)
中,这将返回无法计算值的空值。我会把它作为答案发布,但我不知道查询的目的是什么。
【参考方案1】:
在您的代码中,您正在检查何时SUM(F_UNITS) <> 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) <> 0
,您可能会有更好的运气。
【讨论】:
以上是关于Oracle 中 CASE WHEN 语句中的 SUM的主要内容,如果未能解决你的问题,请参考以下文章
oracle如何在CASE WHEN ELSE语句中使用select语句?