繁体   English   中英

SSRS表达式评估问题嵌套IIF /开关

[英]SSRS Expression Evaluation Issue Nested IIF/Switch

长期读者,第一次海报。

我想得到有关SSRS表达式的帮助,但情况有些棘手。

除其他外,我在一个名为Table的表中有2列:

ForecastMovementCurrentPeriod ActualMovementCurrentPeriod

我有5个条件需要在表达式中应用于第三列。

它们如下:

如果ForecastMovementCurrentPeriod = 0并且'ActualMovementCurrentPeriod-ForecastMovementCurrentPeriod'> 0,则返回“ -100%”

如果ForecastMovementCurrentPeriod = 0并且'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%,则返回(ActualMoveCurrentForiodPeriod)

这些是表达式需要返回的条件。 我已经尝试过将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列的%值),这将正确返回。 我遇到的问题是,当满足前两个条件时,它会返回错误,例如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%"
    )

它为相同的行返回正确的值,当其他三行在其中时,该行返回#Error! 我无法为自己的生命解决这个问题。 我试过嵌套的IIF语句无济于事。

谁能告诉我我可能做错了什么? 据我所知,SWITCH语句将根据语句在其中的顺序返回第一个值为TRUE的值。 当满足条件并且我的SWITCH语句的最后3行也在那里时,为什么它不返回“ -100%”或“ + 100%”?

任何帮助都是极好的!

编辑:

我已经解决了这个问题。

我最终弄清楚了。 即使SWITCH语句将为第一个表达式返回一个真值,但看起来SWITCH语句直到在该语句中的每个表达式都经过求值后才真正返回该值。 当它尝试评估最后3条语句时,除数为零,这就是为什么即使第一个表达式评估为true也会返回#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一旦找到第一个真实值就不会终止对整个块的评估-对我而言似乎是浪费计算。

无论如何,谢谢大家!

我认为您的最后一个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)

第六行不是有效的计算,因为您过早关闭了parens。 你需要把最后一个括号中的“<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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM