簡體   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