2017-11-18 127 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=112869也给20

并且当然select round(20.000000298023224) = round(20);返回1

那么,我的查询有什么问题,该记录正在返回?

+1

'轮(assignments.fixed_hours)需要一批'从表中随机选择的行得到这个值。它不太可能会选择一个匹配整个表的总和的行。 – Barmar

+1

最大的问题是'SUM'聚合......没有分组,这将把所有单独的行合并成一行。 MySQL有一个允许查询处理的扩展,而像这样的查询会在其他RDBMS中引发错误。一个快速解决方案(不一定是最正确的解决方案)是添加'GROUP BY foo',其中foo是'assignments'表的主键列,或者禁止这一点,一些表达式在'assignments'表,即没有两行将共享相同的值。 – 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) 
;