[英]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.