【问题标题】:Avoiding divide by zero error when summing this year vs last year今年与去年相加时避免除以零错误
【发布时间】:2016-03-24 21:44:26
【问题描述】:

我正在尝试编写一个脚本来显示成员的逐年增长。但是,我们总是在添加或删除成员,因此某些人可能不存在 LY。我尝试使用的脚本是;

select
DBA as 'Retailor',
sum(case when TranDate between @start and @end then TranAmount else 0 end)/
sum(case when TranDate between dateadd(year, -1, @start) and dateadd(year, -1, @end) then TranAmount else 0 end) -1

但是,我总是以除以零的错误告终。我也尝试用我在之前的答案中找到的 nullif(0,0) 替换 else 0,但仍然存在相同的问题。任何帮助将不胜感激。

我是菜鸟,自学使用SQL才3个月

【问题讨论】:

  • 如果“总和(当 TranDate 介于 dateadd(year, -1, @start) 和 dateadd(year, -1, @end) then TranAmount else 0 end) -1 之间的情况下)为零,那分裂的结果是什么?

标签: sql sql-server


【解决方案1】:

在您的情况下,最简单的方法是简单地删除分母中的else 0

(sum(case when TranDate between @start and @end then TranAmount else 0 end)/
 sum(case when TranDate between dateadd(year, -1, @start) and dateadd(year, -1, @end)
          then TranAmount 
     end) - 1

假设 TranAmount is always greater than 0, this will returnNULL` 如果没有匹配项。

没有那个简单的改变,下一个最简单的方法是NULLIF()

(sum(case when TranDate between @start and @end then TranAmount else 0 end)/
 nullif(sum(case when TranDate between dateadd(year, -1, @start) and dateadd(year, -1, @end)
                 then TranAmount 
            end), 0) - 1

【讨论】:

  • 完善分母周围的 nullif 没有问题。当我删除 else 0 时,它返回以下消息;警告:空值被聚合或其他 SET 操作消除。感谢您的帮助!
  • @Mesa 不要只感谢他。 G. 接受他的回答。否则,你有点粗鲁;)
猜你喜欢
  • 2022-11-16
  • 2018-04-25
  • 2016-11-08
  • 2017-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多