T-SQL - 报表生成器从两个数据源IIF,嵌套IIF和LOOKUP中评估Nothing或Null

时间:2014-09-15 16:41:26

标签: tsql reporting-services lookup iif

我正在尝试在报表中创建一个表达式,该表达式来自两个不同数据集的数据,这两个数据集是从不同的数据源创建的。两个数据集之间的公共字段是Dataset01的 Name01 和Dataset02的 Term01 。一旦数据集同步,它将采用保护字段位数据类型并对其进行评估。如果为0,则文本输出应为“不保护”。如果为1则生成的文本为“Protect”。在报告的另一部分,有几个字段将基于整数生成文本,0 =“未安装”,1 =“已安装”,2 =“待定”,而NULL返回“不存在”。

我遇到的问题是当Dataset01中的记录在Dataset02中没有匹配的记录时,我想生成文本“Not Present”。另外,我在Dataset02中有一些记录,其中 Protect 字段设置为0或1,但Dataset01中没有相应的记录。在这种情况下,想要对 Protect 字段进行评估,以便在为Dataset01输出“Not Present”时显示“Do Not Protect”或“Protect”。

我尝试了两种解决此问题的方法:

运行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,则评估为TRUE的IIF语句。如果为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的新手,我正在使用Report Builder进行此操作。如果Report Builder有局限性,并且我需要做一些更高级的工作来使用Visual Studio来完成这项工作,那么我可以尝试一下。任何人可以给我的建议或指示将不胜感激。

1 个答案:

答案 0 :(得分:0)

听起来您没有使用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。

此TSQL语句需要是报告的数据源,并且数据集01/02需要替换为您要查询的数据库中的表。

不是在报表中进行查找,而是在TSQL中进行连接通常会更快,因为它更好地处理大型数据集而不必通过痛苦行(RBAR)来评估它。该报告是将相关数据汇总在一起的好地方,即Invoice标题到Invoice行。