长期读者,第一次海报。
我的 SSRS 表达式遇到了一个棘手的情况,我想获得帮助。
除其他外,我在一个名为的表中有 2 列:
ForecastMovementCurrentPeriod 实际MovementCurrentPeriod
我有 5 个条件需要在表达式中应用于第三列。
它们如下:
如果 ForecastMovementCurrentPeriod = 0 AND 'ActualMovementCurrentPeriod-ForecastMovementCurrentPeriod'>0,则返回“-100%”
如果 ForecastMovementCurrentPeriod = 0 AND 'ActualMovementCurrentPeriod-ForecastMovementCurrentPeriod'<0,则返回“+100%”
如果 ForecastMovementCurrentPeriod <> 0 并且如果 'ActualMovementCurrentPeriod-ForecastMovementCurrentPeriod' 不是错误,并且 ABS((ActualMovementCurrentPeriod-ForecastMovementCurrentPeriod) / ForecastMovementCurrentPeriod) > 100%,则返回“大”
如果 ForecastMovementCurrentPeriod <> 0 并且如果 'ActualMovementCurrentPeriod-ForecastMovementCurrentPeriod' 不是错误,并且 ABS((ActualMovementCurrentPeriod-ForecastMovementCurrentPeriod) / ForecastMovementCurrentPeriod) < 20%,则返回“次要”
如果 ForecastMovementCurrentPeriod <> 0 并且如果 'ActualMovementCurrentPeriod-ForecastMovementCurrentPeriod' 不是错误并且 ABS((ActualMovementCurrentPeriod-ForecastMovementCurrentPeriod)/ForecastMovementCurrentPeriod) < 100% 和 > 20%,则返回 (ActualMovementCurrentPeriod-ForecastMovementCurrentPeriod)/ForecastMovement
这些是表达式需要返回的条件。我尝试了 SWITCH 语句和 IIF 语句的组合,但我无法让它工作。
下面是我的代码:
=SWITCH
(
SUM(Fields!ForecastMovementCurrentPeriod.Value) = 0.00 AND SUM(Fields!ActualMovementCurrentPeriod.Value) - SUM(Fields!ForecastMovementCurrentPeriod.Value) > 0.00, "-100%",
SUM(Fields!ForecastMovementCurrentPeriod.Value) = 0.00 AND SUM(Fields!ActualMovementCurrentPeriod.Value) - SUM(Fields!ForecastMovementCurrentPeriod.Value) < 0.00, "+100%",
SUM(Fields!ForecastMovementCurrentPeriod.Value) <> 0 AND (SUM(Fields!ActualMovementCurrentPeriod.Value) - SUM(Fields!ForecastMovementCurrentPeriod.Value) <> 0.99123131414) AND (ABS(SUM(Fields!ActualMovementCurrentPeriod.Value)) - ABS(SUM(Fields!ForecastMovementCurrentPeriod.Value))) / ABS(SUM(Fields!ForecastMovementCurrentPeriod.Value)) > 1.00, "Large",
SUM(Fields!ForecastMovementCurrentPeriod.Value) <> 0 AND (SUM(Fields!ActualMovementCurrentPeriod.Value) - SUM(Fields!ForecastMovementCurrentPeriod.Value) <> 0.9912313141) AND (ABS(SUM(Fields!ActualMovementCurrentPeriod.Value)) - ABS(SUM(Fields!ForecastMovementCurrentPeriod.Value))) / ABS(SUM(Fields!ForecastMovementCurrentPeriod.Value)) < 0.20, "Minor",
SUM(Fields!ForecastMovementCurrentPeriod.Value) <> 0 AND (SUM(Fields!ActualMovementCurrentPeriod.Value) - SUM(Fields!ForecastMovementCurrentPeriod.Value) <> 0.9912313141) AND ((ABS(SUM(Fields!ActualMovementCurrentPeriod.Value)) - ABS(SUM(Fields!ForecastMovementCurrentPeriod.Value))) / ABS(SUM(Fields!ForecastMovementCurrentPeriod.Value)) > 0.20 AND (ABS(SUM(Fields!ActualMovementCurrentPeriod.Value)) - ABS(SUM(Fields!ForecastMovementCurrentPeriod.Value))) / ABS(SUM(Fields!ForecastMovementCurrentPeriod.Value))) < 1.00, (SUM(Fields!ActualMovementCurrentPeriod.Value) - SUM(Fields!ForecastMovementCurrentPeriod.Value)) / SUM(Fields!ForecastMovementCurrentPeriod.Value)
)
这将正确返回“大”、“小”和最终标准,即 2 列的 % 值。我遇到的问题是,当满足前 2 个条件时,它返回一个错误,例如 ForecastMovementCurrentPeriod = 0 AND ActualMovementCurrentPeriod-ForecastMovementCurrentPeriod 结果是“5” - 它应该返回“-100%”,而是返回 #Error .
有趣的是,如果我删除了 SWITCH 语句中的最后 3 行,那么我只有,说:
=SWITCH
(
SUM(Fields!ForecastMovementCurrentPeriod.Value) = 0.00 AND SUM(Fields!ActualMovementCurrentPeriod.Value) - SUM(Fields!ForecastMovementCurrentPeriod.Value) > 0.00, "-100%",
SUM(Fields!ForecastMovementCurrentPeriod.Value) = 0.00 AND SUM(Fields!ActualMovementCurrentPeriod.Value) - SUM(Fields!ForecastMovementCurrentPeriod.Value) < 0.00, "+100%"
)
它返回相同行的正确值,当其他 3 行在其中时返回 #Error !我这辈子都想不通。我试过嵌套的 IIF 语句无济于事。
谁能告诉我我做错了什么?据我所知,SWITCH 语句将根据语句存在的顺序返回第一个值为 TRUE 的值。当满足条件并且我的 SWITCH 语句的最后 3 行也存在时,为什么它不会返回“-100%”或“+100%”?
任何帮助都是极好的!
编辑:
我已经弄清楚了这个问题。
我最终设法弄清楚了。尽管 SWITCH 语句将为第一个表达式返回一个真值,但看起来 SWITCH 语句实际上不会返回该值,直到它对语句中的每个表达式求值之后。当它试图评估最后 3 条语句时,会出现除以零的情况,这就是为什么即使第一个表达式评估为真,它也会返回 #ERROR 的原因。
奇怪的行为,因为我认为一旦 SWITCH 语句找到了一个真实的值,它就不会费心去评估其他的了。
我的解决方案是将 IIF 语句包裹在最后 3 个表达式周围,以避免除以零。
代码如下:
=SWITCH
(
SUM(Fields!ForecastMovementCurrentPeriod.Value) = 0.00 AND SUM(Fields!ActualMovementCurrentPeriod.Value) - SUM(Fields!ForecastMovementCurrentPeriod.Value) > 0.00, "-100%",
SUM(Fields!ForecastMovementCurrentPeriod.Value) = 0.00 AND SUM(Fields!ActualMovementCurrentPeriod.Value) - SUM(Fields!ForecastMovementCurrentPeriod.Value) < 0.00, "+100%",
SUM(Fields!ForecastMovementCurrentPeriod.Value) <> 0 AND (SUM(Fields!ActualMovementCurrentPeriod.Value) - SUM(Fields!ForecastMovementCurrentPeriod.Value) <> 0.99123131414) AND IIf(ABS(Sum(Fields!ForecastMovementCurrentPeriod.Value)) = 0, 0, ABS(Sum(Fields!ActualMovementCurrentPeriod.Value)) - ABS(Sum(Fields!ForecastMovementCurrentPeriod.Value))) / IIf(ABS(Sum(Fields!ForecastMovementCurrentPeriod.Value)) = 0, 1, ABS(Sum(Fields!ForecastMovementCurrentPeriod.Value))) > 1.00, "Large",
SUM(Fields!ForecastMovementCurrentPeriod.Value) <> 0 AND (SUM(Fields!ActualMovementCurrentPeriod.Value) - SUM(Fields!ForecastMovementCurrentPeriod.Value) <> 0.9912313141) AND IIf(ABS(Sum(Fields!ForecastMovementCurrentPeriod.Value)) = 0, 0, ABS(Sum(Fields!ActualMovementCurrentPeriod.Value)) - ABS(Sum(Fields!ForecastMovementCurrentPeriod.Value))) / IIf(ABS(Sum(Fields!ForecastMovementCurrentPeriod.Value)) = 0, 1, ABS(Sum(Fields!ForecastMovementCurrentPeriod.Value))) < 0.20, "Minor",
SUM(Fields!ForecastMovementCurrentPeriod.Value) <> 0 AND (SUM(Fields!ActualMovementCurrentPeriod.Value) - SUM(Fields!ForecastMovementCurrentPeriod.Value) <> 0.9912313141) AND (IIf(ABS(Sum(Fields!ForecastMovementCurrentPeriod.Value)) = 0, 0, ABS(Sum(Fields!ActualMovementCurrentPeriod.Value)) - ABS(Sum(Fields!ForecastMovementCurrentPeriod.Value))) / IIf(ABS(Sum(Fields!ForecastMovementCurrentPeriod.Value)) = 0, 1, ABS(Sum(Fields!ForecastMovementCurrentPeriod.Value))) > 0.20 AND IIf(ABS(Sum(Fields!ForecastMovementCurrentPeriod.Value)) = 0, 0, ABS(Sum(Fields!ActualMovementCurrentPeriod.Value)) - ABS(Sum(Fields!ForecastMovementCurrentPeriod.Value))) / IIf(ABS(Sum(Fields!ForecastMovementCurrentPeriod.Value)) = 0, 1, ABS(Sum(Fields!ForecastMovementCurrentPeriod.Value)))) < 1.00, IIf(ABS(Sum(Fields!ForecastMovementCurrentPeriod.Value)) = 0, 0, ABS(Sum(Fields!ActualMovementCurrentPeriod.Value)) - ABS(Sum(Fields!ForecastMovementCurrentPeriod.Value))) / IIf(ABS(Sum(Fields!ForecastMovementCurrentPeriod.Value)) = 0, 1, ABS(Sum(Fields!ForecastMovementCurrentPeriod.Value))),
TRUE, "Error"
)
我仍然觉得奇怪的是,一旦 SWITCH 找到第一个真值,它就不会终止对整个块的评估——这对我来说似乎是一种计算浪费。
总之谢谢各位!