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

如何在SSRS中结合IIF与Lookup表达式实现指定条件取值

解决SSRS跨数据集匹配筛选的问题

问题根源

你用的Lookup函数在SSRS里只会返回第一个匹配关联ID的记录,如果数据集B里同一个PhaseTrackingID对应多条记录,且第一条的Inspection不是"VC",哪怕后面有符合条件的记录,你的条件判断也会不成立,最终返回Nothing。

两种解决方案

方案1:用LookupSet+自定义代码筛选

  1. 打开报表属性,切换到「代码」标签,添加这段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值。

  1. 把原来的表达式替换成下面的内容:
=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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 00:24:57