Report Builder除零问题及超限运行数统计公式故障排查
问题分析与解决方案
你的公式结果始终为1,核心原因是内层Sum(Fields!OUTPUTwt.Value)和Sum(Fields!INPUTwt.Value)未指定分组作用域,直接计算了整个数据集的总和,导致IIf只会返回一次1或0,外层Sum自然只能得到1或0,而非统计每个符合条件的运行次数。
解决方案1:报表层面修正公式(推荐)
需按runnumber分组计算每个运行的recovery,再判断是否超限,最后统计数量。替换为以下公式(注意将runnumberGroup替换为你报表中按runnumber分组的行组名称):
=CountDistinct( IIf( Sum(Fields!INPUTwt.Value, "runnumberGroup") = 0, Nothing, IIf( Code.Divider(Sum(Fields!OUTPUTwt.Value, "runnumberGroup"), Sum(Fields!INPUTwt.Value, "runnumberGroup"))*100 <= Parameters!LowerYield.Value Or Code.Divider(Sum(Fields!OUTPUTwt.Value, "runnumberGroup"), Sum(Fields!INPUTwt.Value, "runnumberGroup"))*100 > Parameters!UpperYield.Value, Fields!runnumber.Value, Nothing ) ), "dsMain" )
也可使用Sum结合分组作用域的写法:
=Sum( IIf( Sum(Fields!INPUTwt.Value, "runnumberGroup") = 0, 0, IIf( Code.Divider(Sum(Fields!OUTPUTwt.Value, "runnumberGroup"), Sum(Fields!INPUTwt.Value, "runnumberGroup"))*100 <= Parameters!LowerYield.Value Or Code.Divider(Sum(Fields!OUTPUTwt.Value, "runnumberGroup"), Sum(Fields!INPUTwt.Value, "runnumberGroup"))*100 > Parameters!UpperYield.Value, 1, 0 ) ), "dsMain" )
解决方案2:数据集层面预处理(更稳定)
直接在SQL查询中计算每个runnumber的超限标记,报表中直接求和即可,避免报表层面的复杂运算:
SELECT runnumber, INPUTwt, OUTPUTwt, -- 计算recovery(处理分母为0) CASE WHEN INPUTwt = 0 THEN NULL ELSE (OUTPUTwt / INPUTwt)*100 END AS recovery, -- 标记是否超限 CASE WHEN INPUTwt = 0 THEN 0 WHEN (OUTPUTwt / INPUTwt)*100 <= @LowerYield OR (OUTPUTwt / INPUTwt)*100 > @UpperYield THEN 1 ELSE 0 END AS isOverLimit FROM your_table -- 其他查询条件
随后报表中直接使用:
=Sum(Fields!isOverLimit.Value, "dsMain")
补充说明
- 确保
runnumberGroup是报表行组的实际名称(可在报表设计器的行组面板查看),指定该作用域才能让Sum按每个运行单独计算,而非整个数据集。 - 对于分母为0的情况,可根据需求决定是否将这类运行计入超限次数,上述公式默认不计入(设为0或Nothing),可自行调整逻辑。
内容的提问来源于stack exchange,提问作者EternalPrimate
相关产品推荐
相关产品推荐

