はじめに
Railsでデータを取得する際に、SQLでROUND内でSUMをして、平均や率として取得する際に一癖あったので備忘録として残しておきます。
やりたいこと
レコードからデータを取得するときに率として取得したい。
一部 / 全体 * 100
のようなイメージ
普通にレコードを取得してから計算することもできるが、アプリの仕様上やクエリ上、viewへの表示、CSVダウンロードなどにも使用するため取得時にデータを整形しておくことが良いと判断しております。
コードサンプル
select(
"ROUND((SUM(一部) / NULLIF(SUM(全体), 0.0)) * 100)
as 算出したい率,
..."
)
ポイントとしてNULLIF()
を用いることで分母が0.0
の場合でもエラーにならないようにしている。
筆者はこの0.0
の箇所を0
にしていたがために、期待する結果にならず多くの時間を費やした。