2017-11-18 14 views
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); 

それは20fixed_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=11286920を与えます。

もちろん、select round(20.000000298023224) = round(20);1を返します。

私のクエリでレコードが返されているのは何ですか?

+1

'ラウンド(assignments.fixed_hours)グループを必要とするが、'テーブルでランダムに選択された行からこの値を取得しています。テーブル全体の合計と一致する行を選択することはほとんどありません。 – Barmar

+1

大きな問題は、 'SUM'集約です。グループを指定しないと、個々の行すべてが単一の行に折りたたまれます。 MySQLにはクエリの処理が可能な拡張機能がありますが、このようなクエリでは他のRDBMSでエラーが発生します。 1つの簡単な修正(必ずしも最も正確な修正ではありません)は 'foo'を' assign 'テーブルの主キー列とするか、またはそれを除いて 'GROUP BY foo'を追加することです。 'assignments'テーブル、つまり2つの行は同じ値を共有しません。 – spencer7593

答えて

3

ニースクエリ要約:)で試して、しかし、あなたがで...

SELECT 
     assignments.* 
FROM assignments 
INNER JOIN (
     SELECT 
      assignment_id 
      , ROUND(SUM(time_entries.scheduled_hours)) sum_hrs 
     FROM time_entries 
     GROUP BY 
      assignment_id 
) te ON assignments.id = te.assignment_id 
WHERE assignments.organization_id = 2 
AND assignments.allocation_mode = 'fixed' 
AND (fixed_hours IS NOT NULL) 
AND te.sum_hrs <> ROUND(assignments.fixed_hours) 
; 
関連する問題