T-SQL-报表生成器从两个数据源IIF、嵌套IIF和LOOKUP计算Nothing或Null



我正试图在报告中创建一个表达式,该表达式将从不同数据源创建的两个不同数据集中获取数据。两个数据集之间的公共字段是Dataset01的Name01和Dataset02的Term01。数据集同步后,它会获取字段Protect(位数据类型)并对其进行评估。如果它为0,则文本输出应为"Do Not Protect"。如果为1,则生成的文本为"保护"。在报告的另一部分,有几个字段将基于整数生成文本,0="未安装",1="已安装",2="挂起",NULL返回"不存在"。

我遇到的问题是,当数据集01中的记录在数据集02中没有匹配的记录时,我想生成文本"不存在"。此外,我在Dataset02中有一些记录,其中Protect字段设置为0或1,但在Dataset01中没有相应的记录。在这种情况下,希望对Protect字段进行评估,以显示"Do Not Protect"或"Protect",同时为Dataset01输出"Not Present"。

我尝试了两种方法来解决这个问题:

运行IIF语句,如果LOOKUP表达式不产生任何结果(即不匹配),则该语句的求值结果为TRUE,并输出文本"Not Present"。如果计算结果为FALSE,则另一个IIF语句计算LOOKUP表达式中的Protect字段;如果为0,则该语句为TRUE,并输出文本"Do Not Protect"。如果该语句的计算结果为FALSE(即Protect=1),则输出文本"Protect"。

=IIF((LOOKUP(First(Fields!Name01.Value, "Dataset01"), Fields!Term01.Value, Fields!Protect.Value, "Dataset02") IS NOTHING), “Not Present”, IIF((LOOKUP(First(Fields!Name01.Value, "Dataset01"), Fields!Term01.Value, Fields!Protect.Value, "Dataset02")=0),“Do Not Protect”, "Protect"))

第二种方法具有类似的结构。如果Protect字段等于0,则IIF语句的计算结果为TRUE。如果为FALSE(即Protect=1或为NULL),则计算第二个IIF语句。如果Protect字段等于1,则该语句的计算结果为TRUE。如果Protect既不是0也不是1,则它为NULL或Nothing,计算结果为FALSE,并输出文本"Not Present"。

=IIF((LOOKUP(First(Fields!Name01.Value, "Dataset01"), Fields!Term01.Value, Fields!Protect.Value, "Dataset02")=0), “Do Not Protect”, IIF((LOOKUP(First(Fields!Name01.Value, "Dataset01"), Fields!Term01.Value, Fields!Protect.Value, "Dataset02")=1),“Protect”, "Not Present"))

我是T-SQL的新手,我正在使用报表生成器进行这方面的工作。如果报表生成器有局限性,并且我需要使用Visual Studio做一些更高级的事情来实现这一点,那么我可以尝试一下。如果有人能给我任何建议或指示,我们将不胜感激。

听起来您不是在使用T-SQL,而是在尝试评估报告本身中的表达式。在T-SQL中,使用LEFT JOIN、CASE和ISNULL()函数很容易满足要求,如下所示:

SELECT
    Dataset01.*,
    CASE ISNULL(Dataset02.Protect, 0)
        WHEN 0 THEN 'Do Not Protect'
        ELSE 'Protect'
    END AS SimpleCase,
    CASE 
        WHEN Dataset02.OtherField = 0 THEN 'Not Installed'
        WHEN Dataset02.OtherField = 1 THEN 'Installed'
        WHEN Dataset02.OtherField = 2 THEN 'Pending'
        WHEN Dataset02.OtherField IS NULL THEN 'Not Present'
    END AS SearchedCase
FROM
    Dataset01
        LEFT JOIN
    Dataset02
        ON Dataset01.Name01 = Dataset02.Term01

这很好地展示了TSQL中CASE语句的两种形式。在第一个例子中,我使用ISNULL来检查null,并将其替换为值。第二个只是直接检查null。

此TSQL语句需要作为报表的数据源,并且需要将Dataset01/02替换为正在查询的数据库中的表。

在TSQL中进行联接通常比在报告中进行查找更快,因为它在处理大型数据集方面要好得多,而不必逐行评估(RBAR)。报告是一个很好的地方,可以将相关数据汇集在一起呈现,即发票头到发票行。

最新更新