使用IIF()从Int或Int Int

时间:2018-02-05 20:42:41

标签: reporting-services ssrs-2008

在我的查询中,我汇总数据以显示当年的月总数,以及年初至今和前两年的总年。我有一列包含月份总数的月份数,以及年份总计的年份数。

enter image description here

我在表格单元格中有以下表达式,以将月份或年份的名称显示为类别:

=IIF(Fields!MonthInt.Value < 1000, Left(MonthName(Fields!MonthInt.Value),3), Fields!MonthInt.Value)

它适用于月份的名称,但年份显示#Error。

Snip of table showing error

我认为这是因为月份名称被转换为字符串,而年份仍然是整数。为了解决这个问题,我使用CStr()和Str()将年份转换为字符串,但这不起作用。我也尝试了一些我发现的自定义代码,并试图改变我需要的东西,但我不知道VB足以解决我从中获得的错误。

我想要实现的目标还有其他技巧吗?

3 个答案:

答案 0 :(得分:0)

您的IIF声明无效,因为它始终会评估真假部分。当MonthInt字段只包含一个月时,LEFT函数将失败,因为它尝试返回3个字符,但永远不会超过两个。

通过使用SWITCH并更改表达式的顺序,您可以避免这种情况。 SWITCH在第一个表达式为true时停止。

以下代码应该有效。

=SWITCH(
        Fields!MonthInt.Value > 1000, Fields!MonthInt.Value,
        True, Left(MonthName(Fields!MonthInt.Value),3)
        )

添加了工作解决方案。 我一直误以为(多年来)SWITCH在第一个真正的结果停止了。显然,混合数据类型时不是这种情况。问题是MonthName函数需要1到12之间的值,所以对于年份行,它试图将2018传递给函数。为了解决这个问题,我现在传入一个IIF语句,如果MonthID字段大于12,则传递虚拟值为1.

我已经测试了这个(最后),它确实按预期工作。

=SWITCH(
        Fields!MonthInt.Value > 1000, Cstr(Fields!MonthInt.Value) ,
        Fields!MonthInt.Value < 1000, Left(Cstr(MonthName(IIF(Fields!MonthInt.Value<=12,Fields!MonthInt.Value,1))),3)
        )

答案 1 :(得分:0)

  

= IIF(Fields!MonthInt.Value&lt; 1000,Left(MonthName(Fields!MonthInt.Value),3),Fields!MonthInt.Value)

以上查询可能因转化而显示错误,请尝试以下代码

> =IIF(Fields!MonthInt.Value < 1000, CStr(Left(MonthName(Fields!MonthInt.Value),3)),
> CStr(Fields!MonthInt.Value))

答案 2 :(得分:0)

我能够通过更改查询来解决此问题。我使用datename()函数获取月份的名称,并将年份转换为nvarchar。由于这一变化,我不得不改变报告中的其他一些功能,因此它并不理想,但最终能够解决这个问题。

我仍然愿意接受其他答案以供将来参考。