0

长期读者,第一次海报。

我的 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 找到第一个真值,它就不会终止对整个块的评估——这对我来说似乎是一种计算浪费。

总之谢谢各位!

4

1 回答 1

0

我认为你的最后一个 switch 语句在错误的地方有一个括号。如果我分解它,这就是我看到的:

    SUM(cpv) <> 0 
    AND (SUM(mcp) - SUM(cpv) <> 0.9912313141)
    AND 
    (
        (ABS(SUM(mcp)) - ABS(SUM(cpv))) / ABS(SUM(cpv)) > 0.20 
        AND (ABS(SUM(mcp)) - ABS(SUM(cpv))) / ABS(SUM(cpv))  -- This is not valid calculation
    ) < 1.00,
      (SUM(mcp) - SUM(cpv)) / SUM(cpv)

第六行不是一个有效的计算,因为你过早地关闭了括号。您需要将最后一个括号放在 < 1.00”之后。像这样:

    SUM(cpv) <> 0 
    AND (SUM(mcp) - SUM(cpv) <> 0.9912313141)
    AND 
    (
        (ABS(SUM(mcp)) - ABS(SUM(cpv))) / ABS(SUM(cpv)) > 0.20 
        AND (ABS(SUM(mcp)) - ABS(SUM(cpv))) / ABS(SUM(cpv)) < 1.00
    ), -- close the parens after 
      (SUM(mcp) - SUM(cpv)) / SUM(cpv)

为了进一步简化,我会尝试使用 BETWEEN 语句,因为它消除了重复:

    SUM(cpv) <> 0 
    AND (SUM(mcp) - SUM(cpv) <> 0.9912313141)
    AND 
    (
        ((ABS(SUM(mcp)) - ABS(SUM(cpv))) / ABS(SUM(cpv))) between 0.20 and 1.00 
    ),
      (SUM(mcp) - SUM(cpv)) / SUM(cpv)
于 2015-05-14T07:26:12.803 回答