発生している問題・エラーメッセージ
MariaDBでdouble型の数値項目で
SUMで集計した結果が本来の数字と微妙にズレてしまいます。
集計は日付とコード単位で行っており、全部の日付で起こっているわけではないけど、1か所でもないという状態です。
発生条件もわからず調査のしようもないので、正確な件数が把握できていません。
数量の微妙なズレですが、一例ですが以下のようになってしまいます。
**正しい結果:**909.09
**集計結果:**909.0899999999999
色々試しているのですが、原因がわからず行き詰ってしまいました。
PHPでは小数点の計算が変にならないように使うBCMathという関数があったので
似たものが無いか調べたのですが見つけられませんでした。
「試したみたこと」でやってみた限り、SQLでUNIONしたら発生するような気もするのですが、
集計結果をUNIONするのはダメなのでしょうか。。。
正しい結果を得られる方法をご存知の方、教えてください!
該当のソースコード
SQL
1SELECT ymd, code, sum(suryo) 2FROM TABLE_A 3GROUP BY ymd, code 4UNION ALL 5SELECT ymd, code, sum(suryo) 6FROM TABLE_B 7GROUP BY ymd, code 8ORDER BY ymd, code
909.09になるはずが909.0899999999999になった時の数値データ(集計前)
398.03 511.06
試したこと
1 TABLE_AのSQLだけ切り出して実行
該当ソースのSQLのうち、TABLE_A側の集計SQLだけ実行しました。
集計結果は「909.09」になりました。
2 TABLE_Aのデータを抜き出して実行
実際のSQLはたくさん条件がついているので、
問題切り出しのためにTABLE_Aで現象が起こっている日付のデータの数量だけを抜き出したテーブルを作成。
切り出したテーブルに対してSQLを実行してみました(UNION無)
集計結果は「909.09」になりました。
3 TABLE_Aのデータを抜き出して実行 その2
TABLE_Aと全く同じ構造のコピーを作って、問題の日付データのみコピー、SQL(UNION有)を実行しました。
集計結果は「909.0899999999999」になりました。
4 もしかして小数点は足せない?
以下SQLを実行してみました。
SQL
1 SELECT 398.03 + 511.06
集計結果は「909.09」になりました。
試しにUNIONしてみる
SQL
1SELECT 398.03 + 511.06 2UNION ALL 3SELECT 0
集計結果は「909.09」と「0」になりました。
5 その他調査
● 集計前データに小数点があるものだけ発生している?
⇒△ 小数点があっても発生していないものがあるが、発生しているものは全て小数点がある。
● 特定の日にちで発生している?
⇒× 見つけた限りランダム
● TABLE_Bとの関連性は?
⇒△ TABLE_Bにデータがあっても無くても発生する。でもUNIONしなければ発生しない。
また下記のようにUNIONするけど相手のテーブルを無しにしても発生する。
SQL
1SELECT ymd, code, sum(suryo) 2FROM TABLE_A 3GROUP BY ymd, code 4UNION ALL 5SELECT '', '', 0 6ORDER BY ymd, code
補足情報(FW/ツールのバージョンなど)
MariaDB 10.1.22
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/10/11 09:25