0

長期讀者,第一次海報。SSRS表達評估問題嵌套IIF /開關

我有一個SSRS表達式的棘手情況,我想獲得幫助。

我有,除其他外,2列的命名錶內:

ForecastMovementCurrentPeriod ActualMovementCurrentPeriod

我有5個條件的需要在表達式將被施加到第三列。

它們分別是:

如果ForecastMovementCurrentPeriod = 0 AND 'ActualMovementCurrentPeriod-ForecastMovementCurrentPeriod'> 0,返回 「-100%」

如果ForecastMovementCurrentPeriod = 0 AND 「ActualMovementCurrentPeriod-ForecastMovementCurrentPeriod '< 0,return 「+ 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)/ ForecastMovementCurrentPeriod)

這些是表達式需要返回的標準。我已經嘗試了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並且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條線在那裏!我不能爲我的生活弄清楚這一點。我試過嵌套的IIF語句無濟於事。

任何人都可以告訴我我可能做錯了什麼?據我所知,SWITCH語句將根據語句的順序返回第一個值爲TRUE的值。當滿足條件並且我的SWITCH語句的最後3行也在那裏時,爲什麼它不會返回「-100%」或「+ 100%」?

任何幫助將會很棒!

編輯:

我已經找到了問題。

我終於弄明白了。儘管SWITCH語句會爲第一個表達式返回一個真值,但它看起來像SWITCH語句直到在語句中對EVERY表達式求值之後纔會真正返回該值。當它試圖評估最後3個語句時,出現了零除以,這就是爲什麼即使第一個表達式評估爲true,它也會返回#ERROR。

奇怪的行爲,因爲我會認爲一旦SWITCH語句找到了真正的值,就不會費心去評估其他的。

我的解決方案是圍繞最終3個表達式包裝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 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" 
    ) 

我仍然覺得奇怪的是,一旦它找到的第一個真值切換不會終止整個區塊的評價 - 好像計算給我一種浪費。

無論如何謝謝你們!

+0

聽起來像一個數據類型的問題。你得到的錯誤是什麼? – APH

+0

嘗試在表達式中轉換所有字段,並確保不會發生被0除的情況。 –

+0

謝謝你們 - 我終於搞清楚了。儘管SWITCH語句會爲第一個表達式返回一個真值,但它看起來像SWITCH語句直到在語句中對EVERY表達式求值之後纔會真正返回該值。 當它試圖評估最後3個語句時,發生了零除,這就是爲什麼它會返回#ERROR,即使第一個表達式評估爲true。 奇怪的行爲,因爲我會認爲一旦SWITCH語句找到了真正的值,就不會費心去評估其他的。 – Michael

回答

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)