【问题标题】:I am getting a divide by 0, how can I make this query more robust?我得到除以 0,我怎样才能使这个查询更健壮?
【发布时间】:2021-08-04 01:59:09
【问题描述】:

我相信下面的划分是导致 null 的原因,我该如何使用 isNull 之类的东西,返回 0?

以下查询获取每天的总净值,并将该值归因于周六、周日和工作日的一周中的某一天。这个想法是根据工作日或周六或周日获得平均净额。

但由于现在仍处于 8 月初,因此还没有统计周六或周日,因此除以 0 得到平均值反而会导致此错误,我该如何更好地处理这个问题?

--@DespatchFrom = '08-01-2021'
--@DespatchFrom = '08-04-2021'

Select E_SAT.SATNet/E_SAT.SATCount As E_SAT,
E_SUN.SUNNet/E_SUN.SUNCount AS E_SUN,
E_WK.WKNet/E_WK.WKCount AS E_WK
from
(select DateDiff(ww, @DespatchFrom, @DespatchTo) as SATCount, 
SUM(CASE WHEN TranType = 'SRT' THEN (Net*-1) ELSE Net END) as SATNet
                from trans t
                where d t.DespatchDateTime >= (@DespatchFrom) and t.despatchDateTime <= DateAdd(d,1,(@DespatchTo))
                and t.cancelleddocket = '0' and t.trantype <> 'DIV'
and DatePart("w",t.Despatchdatetime) = 7)
AS E_SAT,

(select DateDiff(ww, @DespatchFrom, @DespatchTo) as SUNCount, 
SUM(CASE WHEN TranType = 'SRT' THEN (Net*-1) ELSE Net END) as SUNNet
                from trans t
                where t.DespatchDateTime >= (@DespatchFrom) and t.despatchDateTime <= DateAdd(d,1,(@DespatchTo))
                and t.cancelleddocket = '0' and t.trantype <> 'DIV'
and DatePart("w",t.Despatchdatetime) = 1)
AS E_SUN,

(select 
   (DATEDIFF(dd, @DespatchFrom, @DespatchTo) + 1)
  -(DATEDIFF(wk, @DespatchFrom, @DespatchTo) * 2)
  -(CASE WHEN DATENAME(dw, @DespatchFrom) = 'Sunday' THEN 1 ELSE 0 END)
  -(CASE WHEN DATENAME(dw, @DespatchTo) = 'Saturday' THEN 1 ELSE 0 END) as WKCount
  , SUM(CASE WHEN TranType = 'SRT' THEN (Net*-1) ELSE Net END) as WKNet
                from trans t
                where t.DespatchDateTime >= (@DespatchFrom) and t.despatchDateTime <= DateAdd(d,1,(@DespatchTo))
                and t.cancelleddocket = '0' and t.trantype <> 'DIV'
and ((DatePart("w",t.Despatchdatetime) > 1) AND (DatePart("w",t.Despatchdatetime) < 7)))
AS E_WK

【问题讨论】:

  • 当值为零时你想发生什么?将值设置为 1(或其他值)以便除法不会出错或将整个计算的结果设置为某个固定值(或完全不同的值)?
  • @NickW 它应该是 0,奇怪的是我的报告已经工作了几个月,突然间我得到了这个除以 0 的错误。

标签: sql reporting-services ssrs-2012 divide-by-zero


【解决方案1】:

如果您希望计算结果为零,那么我会使用 CASE 语句,例如:

CASE WHEN E_SAT.SATCount = 0 THEN 0 
ELSE E_SAT.SATNet/E_SAT.SATCount END As E_SAT

【讨论】:

    猜你喜欢
    • 2013-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多