0
丸めた合計を整数と比較するクエリがあり、予期しない結果が発生しています。MySQL:整数が整数に等しくないように丸めた
SELECT assignments.*
FROM assignments
INNER JOIN time_entries
ON time_entries.assignment_id = assignments.id
WHERE assignments.organization_id = 2
AND assignments.allocation_mode = 'fixed'
AND (fixed_hours is not null)
HAVING round(sum(time_entries.scheduled_hours)) != round(assignments.fixed_hours);
それは20
のfixed_hours
との割り当てを返します。列は浮動小数点数です。
そのレコードに一致するtime_entriesの合計を選択すると、20.000000298023224
が得られます。私はその上round
を呼び出すと、私は20
を得る:
SELECT
round(sum(scheduled_hours))
FROM time_entries
WHERE assignment_id=112869;
そしてSELECT round(fixed_hours) from assignments where id=112869
も20
を与えます。
もちろん、select round(20.000000298023224) = round(20);
は1
を返します。
私のクエリでレコードが返されているのは何ですか?
'ラウンド(assignments.fixed_hours)グループを必要とするが、'テーブルでランダムに選択された行からこの値を取得しています。テーブル全体の合計と一致する行を選択することはほとんどありません。 – Barmar
大きな問題は、 'SUM'集約です。グループを指定しないと、個々の行すべてが単一の行に折りたたまれます。 MySQLにはクエリの処理が可能な拡張機能がありますが、このようなクエリでは他のRDBMSでエラーが発生します。 1つの簡単な修正(必ずしも最も正確な修正ではありません)は 'foo'を' assign 'テーブルの主キー列とするか、またはそれを除いて 'GROUP BY foo'を追加することです。 'assignments'テーブル、つまり2つの行は同じ値を共有しません。 – spencer7593