【SQL】division by zero って何?? ゼロ除算エラーを回避せよ!

【SQL】division by zero って何??ゼロ除算エラーを回避せよ!

こんにちは、hosigakiです!

今回は「ゼロ除算エラー」の紹介と、その対処方法についてまとめていきます!

ゼロ除算エラーって何?

SQLで分析をしていて、「division by zero」のようなエラーを見たことはありませんか?
これは、ゼロ除算エラーと呼ばれるもので、

ある数を0で割ろうとしている

という際に発生するエラーです。

実際のゼロ除算エラーを見てみましょう。
例えば、以下のテーブルを用いて、CVR(コンバージョンレート。CV わる PV で算出可能。)を計算するとします。

dayspvcv
2022-5-11001
2022-5-21200
2022-5-31402
2022-5-404
2022-5-51002
user_actionsテーブル
SELECT
    days,
    cv / pv AS cvr
FROM
    user_actions

もし上のようなクエリを実行してしまうと、以下のようなゼロ除算エラーが発生します。

division by zero: 4 / 0

上記のゼロ除算エラー文では、「4を0で割ろうとしています。」ということを教えてくれてますが、実際に2022-5-4でcvが4、pvが0のため、それらの割り算部分でエラーが発生していることが分かりますね!

(ちなみに、2022-5-2は 0 / 120 という計算が行われますが、これはゼロ除算エラーとならず、0という値が算出されます。)

コラム ~定期更新用クエリでは、特に注意が必要!?~

ゼロ除算エラーの怖いところは、「クエリは変わらないのに、日によってゼロ除算エラーが起こらない日もあれば、起こる日もある」という点です。

例えば、定期更新用のクエリで、毎日過去30日のPVとCVから、日別のCVRを算出するクエリを書いたとします。
クエリを作成した時点では何もエラーが起こらかったとしても、例えば3日後などにPVが0の日があったとすれば、ゼロ除算エラーが発生してしまい、正常にクエリが定期更新できなくなってしまいます。

このような予期せぬエラーを引き起こさないためにも、クエリで割り算をする際は、ゼロ除算エラーへの対処が必要となってきます。

ゼロ除算エラーの対処方法

ゼロ除算エラーに対処するためには、クエリ内で以下のような分岐をつくるのが効果的です。

分母(割る数)が0の時 → 割り算せずに「0」とする
分母(割る数)が0以外の時 → 割り算する

以下は、先ほどの上記で記載したクエリを、ゼロ除算エラーが起こらないように修正したものです。

SELECT
    days,
    (CASE WHEN pv = 0 THEN 0 ELSE cv / pv END) AS cvr
FROM
    user_actions

こうすることで、何かを0で割ろうとする事象が発生しなくなるため、ゼロ除算エラーを回避することができます!

今日はゼロ除算エラーとその対処方法についてご紹介しました!

ここまで読んでいただき、ありがとうございます。
また次の記事でお会いしましょう!(^^)/

-SQL
-, , ,