You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在RDLC报表中对唯一值求和?求实用解决技巧

RDLC报表中对唯一值求和的实用技巧

我完全懂你现在的头疼——直接用SUM(Cdec(Fields!Given_wt.Value))会把重复行的数值都算进去,导致结果翻倍。针对这个问题,这里有几个靠谱的解决办法,按推荐程度排序:

方法一:从数据源层面去重(最推荐)

如果你的报表数据来自数据库,直接在查询阶段就把重复行干掉是最省心的。比如用DISTINCT关键字:

SELECT DISTINCT [Given Wt], [Retained], [Given%], [Discount], [Net Payment] FROM YourTableName

或者用GROUP BY把相同的分组合并(如果其他字段也对应相同值的话):

SELECT [Given Wt], [Retained], [Given%], [Discount], [Net Payment] 
FROM YourTableName
GROUP BY [Given Wt], [Retained], [Given%], [Discount], [Net Payment]

这样报表拿到的就是唯一行,直接用SUM就能得到你想要的29.867了。

方法二:在RDLC中编写自定义代码求和

如果没法修改数据源,那可以在报表里写一段自定义代码来跟踪唯一值。步骤如下:

  1. 打开报表的报表属性(右键报表空白处选择“报表属性”),切换到“代码”标签。
  2. 粘贴以下VB代码:
Private uniqueWts As New System.Collections.Generic.Dictionary(Of Decimal, Boolean)

Public Function SumUniqueWt(ByVal wt As Decimal) As Decimal
    ' 只添加未记录过的数值
    If Not uniqueWts.ContainsKey(wt) Then
        uniqueWts.Add(wt, True)
    End If
    ' 计算当前所有唯一值的总和
    Dim total As Decimal = 0
    For Each key In uniqueWts.Keys
        total += key
    Next
    Return total
End Function

Public Function ResetUniqueWts() As Integer
    ' 清空字典,用于分组或分页时重置
    uniqueWts.Clear()
    Return 0
End Function
  1. 在需要显示求和结果的文本框中,设置表达式为:
    =Code.SumUniqueWt(Cdec(Fields!Given_wt.Value))
  2. 重要提示:如果报表有分组或者分页,记得在分组的页眉/页脚添加一个隐藏的文本框,表达式设为=Code.ResetUniqueWts(),这样每个分组都会重新统计唯一值,不会互相干扰。

方法三:用LookupSet结合SUM(适用于有唯一标识的场景)

如果你的数据里有唯一的行ID(或者能唯一区分重复行的字段),可以用LookupSet函数来获取所有唯一的Given Wt值,再求和:

=SUM(LookupSet(Fields!Given_wt.Value, Fields!Given_wt.Value, Fields!Given_wt.Value, "YourDataSetName"))

原理是LookupSet会返回每个唯一Given_wt对应的列表,SUM会自动对列表里的唯一值求和。不过要注意:如果数值有精度差异(比如看起来相同但实际小数位不同),这个方法可能会失效,建议先对数值做精度处理(比如用Round函数统一小数位数)。


内容的提问来源于stack exchange,提问作者Imthiyaz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:46:02