Crystal Reports 公式带条件统计关联第二表字段差值总和问题
Crystal Reports 带条件明细汇总实现方案
问题根源
你原公式的逻辑错误在于:SUM()是聚合函数,会统计所有关联明细行的总和,外层的IF判断仅作用于当前明细行的返回值,不会过滤SUM()本身的计算范围,因此最终结果会包含ITEM_CANCEL=1的记录。
如果在选择专家中新增过滤条件,会将左连接中无对应明细的主表记录全部过滤,不符合需求。
解决方案
有两种实现方式均可满足需求,不需要修改全局过滤条件,也不会丢失无明细的主表记录:
方式1:分两步计算(可读性更高)
- 先新建一个明细级公式
@Valid_Line_Diff,逐行计算有效行的差值:
IF {current_order1.ITEM_CANCEL} = 0 THEN {current_order1.QTY_SHIPPED} - {current_order1.QTY_ORD} ELSE 0
- 再对该公式做聚合汇总即可,如果你需要按主表主键分组统计每个主记录的差值,将
SUM({@Valid_Line_Diff})放在对应主键的组头/组尾区域即可;如果需要全局汇总,放在报表头/尾即可。
方式2:单公式条件聚合(直接调用)
不需要单独新建明细公式,直接使用条件聚合写法即可:
SUM(IF {current_order1.ITEM_CANCEL} = 0 THEN {current_order1.QTY_SHIPPED} ELSE 0) - SUM(IF {current_order1.ITEM_CANCEL} = 0 THEN {current_order1.QTY_ORD} ELSE 0)
注意事项
- 汇总公式不要放在明细区域,否则每行都会重复显示整组/整个报表的汇总值
- 无对应明细的主表记录,公式返回值为0,如果你需要展示为空白或其他标识,在外层补充
IF判断即可 - 不需要在选择专家中新增
ITEM_CANCEL=0的过滤条件,公式已经在计算层完成了有效行的过滤
内容的提问来源于stack exchange,提问作者Keshav Bhojwani
相关产品推荐
相关产品推荐

