web-dev-qa-db-ja.com

Redshift Divide ByZeroパズル

このコードでゼロ除算エラーが発生していました:

CASE
WHEN DENOMINATOR >= 0
THEN SUM(INT1 * INT2 / DENOMINATOR)
ELSE 0
END AS RATIO

しかし、次のコードに変更すると、機能しました。

CASE
WHEN DENOMINATOR >= 0
THEN SUM(INT1) * INT2 / DENOMINATOR
ELSE 0
END AS RATIO

誰かが私が理由を理解するのを手伝ってくれるので、将来これを避けることができますか?ところで、最初のサンプルはVerticaで機能しました。合計がより良いプログラミング手法になる前に計算を行うのではなく、合計する必要があるものだけを合計することを理解しています。しかし、それでも興味があります。

5
cjremley

ゼロ除算を回避する最善の方法は、nullif()を使用することだと思います。

_SUM(INT1 * INT2 / NULLIF(DENOMINATOR, 0))
_

または:

_SUM(INT1) * INT2 / NULLIF(DENOMINATOR, 0)
_

これはNULLを返します。これは、ゼロ除算の状況でより賢明だと思います。必要に応じて、COALESCE()を追加して_0_を取得できます。

16
Gordon Linoff