Sql 当报告不';不要求两个字段,它开始被零除

Sql 当报告不';不要求两个字段,它开始被零除,sql,Sql,我对这两种说法有意见 因为当报表不询问列“Invboxamount”或/和freebox时,整个查询将返回一个错误,即它决定“零除错误” 当询问这两列时,我应该做些什么来避免影响整个查询 也许有更好的方法来写这个 sum (Case when bm.CaseQTY IS NULL then (k.postedqty / mm.CaseQTY) else (k.postedqty / bm.CaseQTY) End) as Invboxamount, sum (Case when bm.

我对这两种说法有意见

因为当报表不询问列“Invboxamount”或/和freebox时,整个查询将返回一个错误,即它决定“零除错误”

当询问这两列时,我应该做些什么来避免影响整个查询

也许有更好的方法来写这个

sum (Case when bm.CaseQTY IS NULL then (k.postedqty / mm.CaseQTY) else (k.postedqty / bm.CaseQTY) End) 
    as Invboxamount,
sum (Case when bm.CaseQTY IS NULL then ((k.postedqty-k.reservordered-k.reservphysical-k.picked+k.registered) / mm.CaseQTY) else ((k.postedqty-k.reservordered-k.reservphysical-k.picked+k.registered) /bm.CaseQTY) End)
    as Freebox

在每个分母出现的情况下,将
CaseQTY
替换为
coalesce(CaseQTY,1)
,例如

sum (Case when bm.CaseQTY IS NULL then 
               (k.postedqty / coalesce(mm.CaseQTY,1)) 
          else (k.postedqty / coalesce(bm.CaseQTY,1)) 
           end) as Invboxamount,
sum (Case when bm.CaseQTY IS NULL then 
              ((k.postedqty-k.reservordered-k.reservphysical-k.picked+k.registered) 
               / coalesce(mm.CaseQTY,1) ) 
          else 
              ((k.postedqty-k.reservordered-k.reservphysical-k.picked+k.registered) 
               / coalesce(bm.CaseQTY,1) ) 
          end) as Freebox

一些示例数据在这里非常有用。显然,
CaseQTY
字段中的一个(或两个)为零(顺便说一下,这与
NULL
不同)。在这种情况下,您希望从查询中得到什么结果?一个明显的选择是返回
NULL
,但这取决于您的需求。请详细说明。在库存软件中,将
x/0
映射到
x
通常是可以的;若分母为零,则分子通常为零。但是你在这里踩着薄冰。我肯定不会将此推广到所有可能的应用程序。我倾向于在即将被零除时产生
NULL