如何在SSRS中结合IIF与Lookup表达式实现指定条件取值
解决SSRS跨数据集匹配筛选的问题
问题根源
你用的Lookup函数在SSRS里只会返回第一个匹配关联ID的记录,如果数据集B里同一个PhaseTrackingID对应多条记录,且第一条的Inspection不是"VC",哪怕后面有符合条件的记录,你的条件判断也会不成立,最终返回Nothing。
两种解决方案
方案1:用LookupSet+自定义代码筛选
- 打开报表属性,切换到「代码」标签,添加这段VB自定义函数:
Public Function GetMatchingPercent(matches As Object(), targetInsp As String, targetDesc As String) As Object For Each item As Object In matches Dim insp As String = item(0).ToString() Dim desc As String = item(1).ToString() Dim percent As Object = item(2) If insp = targetInsp And desc = targetDesc Then Return percent End If Next Return Nothing End Function
这个函数会遍历所有关联的记录,找出同时满足Inspection="VC"和PhaseInspDesc="INTERMEDIATE 12MO"的percentComplete值。
- 把原来的表达式替换成下面的内容:
=Code.GetMatchingPercent( LookupSet(Fields!PhaseMaintTrackingId.Value, Fields!FK_PhaseMaintTrackingId.Value, Array(Fields!Insp.Value, Fields!PhaseInspDesc.Value, Fields!percentComplete.Value), "Perc_Comp_By_Phase_INSP_Type"), "VC", "INTERMEDIATE 12MO" )
LookupSet会返回当前ID对应的所有B数据集记录的字段数组,自定义函数负责从中筛选符合条件的百分比值。
方案2:直接在数据集B的查询里预筛选(更高效)
如果报表允许修改数据集查询,建议直接在数据库层面过滤掉不符合条件的记录,这样后续用Lookup就不会有问题:
-- 示例SQL,根据你的实际表名调整 SELECT FK_PhaseMaintTrackingId, Insp, PhaseInspDesc, percentComplete FROM 你的数据表名 WHERE Insp = 'VC' AND PhaseInspDesc = 'INTERMEDIATE 12MO'
修改完数据集B后,原来的表达式可以简化成:
=Lookup(Fields!PhaseMaintTrackingId.Value, Fields!FK_PhaseMaintTrackingId.Value, Fields!percentComplete.Value, "Perc_Comp_By_Phase_INSP_Type")
这种方法性能更好,因为提前在数据库里完成了筛选,不用在报表端处理多条记录的遍历。
内容的提问来源于stack exchange,提问作者Dskipper
相关产品推荐
相关产品推荐

