こんにちは、hosigakiです!
今回は「ゼロ除算エラー」の紹介と、その対処方法についてまとめていきます!
ゼロ除算エラーって何?
SQLで分析をしていて、「division by zero」のようなエラーを見たことはありませんか?
これは、ゼロ除算エラーと呼ばれるもので、
ある数を0で割ろうとしている
という際に発生するエラーです。
実際のゼロ除算エラーを見てみましょう。
例えば、以下のテーブルを用いて、CVR(コンバージョンレート。CV わる PV で算出可能。)を計算するとします。
days | pv | cv |
---|---|---|
2022-5-1 | 100 | 1 |
2022-5-2 | 120 | 0 |
2022-5-3 | 140 | 2 |
2022-5-4 | 0 | 4 |
2022-5-5 | 100 | 2 |
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で割ろうとする事象が発生しなくなるため、ゼロ除算エラーを回避することができます!
今日はゼロ除算エラーとその対処方法についてご紹介しました!
ここまで読んでいただき、ありがとうございます。
また次の記事でお会いしましょう!(^^)/