如何在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中编写自定义代码求和
如果没法修改数据源,那可以在报表里写一段自定义代码来跟踪唯一值。步骤如下:
- 打开报表的报表属性(右键报表空白处选择“报表属性”),切换到“代码”标签。
- 粘贴以下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
- 在需要显示求和结果的文本框中,设置表达式为:
=Code.SumUniqueWt(Cdec(Fields!Given_wt.Value)) - 重要提示:如果报表有分组或者分页,记得在分组的页眉/页脚添加一个隐藏的文本框,表达式设为
=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
相关产品推荐
相关产品推荐

