を引き起こすために使用されるSQLクエリがあります
ゼロ除算例外
これを防ぐために、CASE
ステートメントでラップしました。これを行う簡単な方法はありますか?
これが私のコードです:
Percentage = CASE WHEN AttTotal <> 0 THEN (ClubTotal/AttTotal) * 100 ELSE 0 END
より良い方法は、次のように [〜#〜] nullif [〜#〜] を使用することです。
Percentage = 100 * ClubTotal / NULLIF(AttTotal, 0)
場合によっては値を返す必要があるため、NULLIF
ビットを異なる方法で使用しています。通常、ゼロ除算エラーがある場合は0を返す必要があります。その場合、式全体をISNULL
でラップします。だから:
Percentage = ISNULL(100 * ClubTotal / NULLIF(AttTotal, 0), 0)
内側の部分はNULL
に評価され、ISNULL
は0に置き換えられます。
Percentage = IsNull(ClubTotal/NullIf(AttTotal, 0) * 100, 0)
私の意見では、CASEステートメントはまさにその方法です。何かを計算するのではなく、AttTotalがゼロの場合に返す値を指定します。 0の0が100%の場合、別のケースブランチを追加することもできます。
ちょっとした注意:AttTotalがゼロでClubTotalがゼロより大きい場合、0を返しません。 NULLの方が適切な場合があります。または、AttTotalがゼロの場合に「No att。total」を含む数字(例、10.5%)ではなく、文字列(例、「10.50%」)を作成します。
PercentageString :=
CASE
WHEN AttTotal = 0 AND ClubTotal = 0 then '100%'
WHEN AttTotal = 0 AND ClubTotal <> 0 THEN 'No att. total'
ELSE to_char(ClubTotal / AttTotal * 100) || '%'
END;
ゼロ除算問題を処理するために私が見つけた解決策は、状況を処理するために呼び出すことができる関数を作成することです。これが私が書いた簡単な関数です。
Create Function fnRatio(@Numerator decimal(10,2),@Demoninator decimal(10,2))
Returns decimal(10,2)
Begin
Return
Case
When @Demoninator = 0 then 0.00
When @Demoninator Is Null then Null
Else
@Numerator/@Demoninator
End
終わり
よろしく
ジェイソン