我正在尝试在报表中创建一个表达式,该表达式来自两个不同数据集的数据,这两个数据集是从不同的数据源创建的。两个数据集之间的公共字段是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来完成这项工作,那么我可以尝试一下。任何人可以给我的建议或指示将不胜感激。
答案 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行。