在SSRS 2008中嵌套IIF

时间:2017-12-19 17:40:53

标签: reporting-services ssrs-2008-r2

我正在编写一个表达式,需要计算当前报表rundate和字段中日期值之间的天数(名为cmp_lastap),然后返回值:

  • "延误"如果已用天数为>= 60
  • &#34;逾期&#34;如果>= 45<60
  • &#34;由于&#34;如果>30<45以及
  • &#34;电流&#34;如果<= 30

似乎我需要使用嵌套的IIF语句,但有些东西已经关闭,我无法弄清楚我做错了什么:

=IIF(DateDiff(DateInterval.Day, Fields!cmp_lastap.Value, Today) >= 60,"DELINQUENT", IIF(DateDiff(DateInterval.Day, Fields!cmp_lastap.Value,Today) > 45 AND <60, "PAST DUE", IIF(DateDiff(DateInterval.Day, Fields!cmp_lastap.Value, Today) > 30 AND <=45, "DUE", IIF(DateDiff(DateInterval.Day, Fields!cmp_lastap.Value, Today) <= 30, "CURRENT")

非常感谢任何有关其他表达方式的帮助或建议!

2 个答案:

答案 0 :(得分:1)

你不必测试少于。正在使用短路布尔评估。

=IIF(DateDiff(DateInterval.Day, Fields!cmp_lastap.Value, Today) >= 60, "DELINQUENT",
    IIF(DateDiff(DateInterval.Day, Fields!cmp_lastap.Value, Today) > 45, "PAST DUE",
        IIF(DateDiff(DateInterval.Day, Fields!cmp_lastap.Value, Today) > 30, "DUE",
            "CURENT")
    )
)   

您还可以使用可能更具可读性的CASE语句。

答案 1 :(得分:1)

你不能使用AND那样,你不得不说[date comparison logic] > X AND [date comparison logic] < Y等......

<强>然而 ... 我发现嵌套的IIF很快就会变得混乱,特别是如果你有多个条件需要测试,所以我更喜欢使用SWITCH

使用开关你可以这样写。

=SWITCH (
    DateDiff(DateInterval.Day, Fields!cmp_lastap.Value, Today) >= 60,"DELINQUENT",
    DateDiff(DateInterval.Day, Fields!cmp_lastap.Value, Today) > 45,"PAST DUE",
    DateDiff(DateInterval.Day, Fields!cmp_lastap.Value, Today) > 30,"DUE",
    True, "CURRENT"
)

另一个好的副作用是SWITCH在第一个计算结果为True的表达式处停止,因此我们不需要测试范围。最终True的行为类似于ELSE

注意我没有测试或检查过你的日期逻辑,但假设这是合理的,那么以上内容就可以了。