SAP Crystal Reports排除已抑制重复数据的分组总额汇总方法问询
Crystal Reports重复数据隐藏后汇总仍包含重复值的解决方法
问题根源
你设置的抑制条件仅隐藏了重复行的显示,但Crystal Reports的汇总计算基于原始数据源的所有记录,不会因为行被抑制就排除对应数据,因此总额仍会包含重复项。
解决方法
方法一:数据源层面去重(最推荐)
直接在报表的SQL数据源阶段排除重复数据,这是最彻底的解决方案:
- 如果使用SQL数据库,可通过
DISTINCT或分组聚合实现去重(以你的重复判断条件为例):-- 方式1:用DISTINCT直接去重 SELECT DISTINCT CNTITEM, IDSHIPNBR, IDCUST, IDINVC, Amount FROM SALES_REPORT_MAIN -- 方式2:分组聚合合并重复项的金额 SELECT CNTITEM, IDSHIPNBR, IDCUST, IDINVC, SUM(Amount) AS Amount FROM SALES_REPORT_MAIN GROUP BY CNTITEM, IDSHIPNBR, IDCUST, IDINVC - 修改数据源后,报表拿到的就是去重后的数据,汇总结果自然正确,无需额外处理抑制和自定义公式。
方法二:修改自定义汇总公式,跳过重复记录
若无法修改数据源,可调整@SumAmount公式,仅累加非重复记录:
- 确保报表已按
CNTITEM、IDSHIPNBR、IDCUST、IDINVC字段排序(保证重复记录连续排列)。 - 替换原公式为:
whileprintingrecords; numbervar qty; -- 仅当当前记录不是重复项时,才累加金额 if not ({SALES_REPORT_MAIN.CNTITEM}=previous({SALES_REPORT_MAIN.CNTITEM}) and {SALES_REPORT_MAIN.IDSHIPNBR}=previous({SALES_REPORT_MAIN.IDSHIPNBR})and {SALES_REPORT_MAIN.IDCUST}="0357-00" and {SALES_REPORT_MAIN.IDINVC} in "INV220004425" to "INV220004426") then qty := qty + {@Amount}; qty;
方法三:使用Running Total字段(Crystal Reports规范做法)
创建Running Total字段替代自定义公式,逻辑更稳定:
- 右键点击字段资源管理器的「Running Total Fields」,选择「New」。
- Field to summarize选择
@Amount,Type of summary选择「Sum」。 - 在「Evaluate」中选择「Use a formula」,输入非重复判断公式:
not ({SALES_REPORT_MAIN.CNTITEM}=previous({SALES_REPORT_MAIN.CNTITEM}) and {SALES_REPORT_MAIN.IDSHIPNBR}=previous({SALES_REPORT_MAIN.IDSHIPNBR})and {SALES_REPORT_MAIN.IDCUST}="0357-00" and {SALES_REPORT_MAIN.IDINVC} in "INV220004425" to "INV220004426") - 在「Reset」中选择「On change of group」,选择客户分组字段
IDCUST。 - 将该Running Total字段放到客户组的组脚注中,替代原
@SumAmount。
内容的提问来源于stack exchange,提问作者Muhammad Hidayat
相关产品推荐
相关产品推荐

