0

select ステートメントのこの部分を実装するたびに、0 による除算の例外が発生します。ISNULL を NUllIF に置き換えてみました。同じエラー。ここに私のコードがあります:

isnull([Balance], 0) * isnull(sce.tradepoundsperunit, 0)  * (isnull(limitallocation_limitcommodity.priceperpound, 0) / CASE WHEN ISNULL(limit_limitcommodity.priceperpound, 1) = 0 THEN 1 ELSE  ISNULL(limit_limitcommodity.priceperpound, 1) END )  / isnull(CASE WHEN ISNULL(l.PoundsPerUnit, 1) = 0 THEN 1 ELSE  ISNULL(l.PoundsPerUnit, 1) END *  ISNULL(targetu.bushelsperunit, 1) ,1)   

AS リミット換算残高、

4

4 に答える 4

1

次の句のいずれかだと思います: ISNULL(limit_limitcommodity.priceperpound, 1) ISNULL(l.PoundsPerUnit, 1) ISNULL(targetu.bushelsperunit, 1)

ゼロではなくnullのみをチェックしているため、0を返す可能性があります。たとえば、l.PoundsPerUnit=0 の場合、ISNULL(l.PoundsPerUnit,1) をチェックしてもゼロが返されます。

このようなものがあなたの問題を解決するはずだと思います。null をチェックする代わりに、すべての分母に対して null またはゼロの両方をチェックし、代わりに 1 を挿入します。

isnull([Balance],0) *
isnull(sce.tradepoundsperunit,0) *
(
    isnull(limitallocation_limitcommodity.priceperpound,0)
    /
    CASE
        WHEN limit_limitcommodity.priceperpound IS NULL OR limit_limitcommodity.priceperpound=0 THEN 1
        ELSE limit_limitcommodity.priceperpoind
    END
) /
(
    CASE 
        WHEN l.PoundsPerUnit IS NULL OR l.PoundsPerUnit =0 THEN 1
        ELSE l.PoundsPerUnit
    END *
    CASE
        WHEN targetu.bushelsperunit IS NULL OR targetu.bushelsperunit=0 THEN 1
        ELSE targetu.bushelsperunit
    END
)
AS Limitconvertedbalance,
于 2015-08-26T21:04:36.773 に答える
0

答えはこのビットにあると思います:

* ISNULL(targetu.bushelsperunit, 1)

targetu.bushelsperunit が 0 の場合、コードは前の / を実行する前にその * を実行している可能性があり、結果として 0 で除算されます。そのフィールドは分母にあることを意味していますか?

于 2015-08-24T20:07:45.917 に答える
0

「nvl」関数を試してください。nvl(yourfield, 0) のように

于 2015-08-24T20:07:53.847 に答える