2014-09-12 257 views
0

以下代码为sumHours字段返回错误的值。它似乎准备sumHours字段,然后一旦GROUP BY运行,将总和加起来。使用两个LEFT JOIN和GROUP BY时出现错误SUM

SELECT mmr_ID, mmr_projectName, SUM(mmr_hoursWorked.mmr_hoursWorked_hours) AS sumHours 
FROM mmr 
LEFT JOIN mmr_hoursWorked 
ON mmr.mmr_ID = mmr_hoursWorked.mmr_hoursWorked_project AND mmr_hoursWorked.mmr_hoursWorked_mm = "P90826" 
LEFT JOIN mmr_notes 
ON mmr.mmr_ID = mmr_notes.mmr_notes_MMR_ref AND mmr_notes.mmr_notes_author = "P90826" 
WHERE mmr_mmAssigned = "P90826" AND mmr_projectStatus != 1 OR mmr_notes.mmr_notes_author = "P90826" AND mmr_projectStatus != 1 
GROUP BY mmr_ID 

实效

mmr_ID - 35
mmr_projectName - 项目A
sumHours - 140.2

预期结果

mmr_ID - 35
mmr_projectName - 项目A
sumhours - 35.05

+2

请显示样本数据,预期结果和实际结果。另外,请编辑该问题,以便您的代码显示为代码。 html标签看起来已经搞乱了。 – 2014-09-12 19:40:22

+2

那么,你正在选择每一列,然后只有一列进行分组。这种非ANSI行为在MySQL中是允许的,如果您想要获得一致的结果,那么它并没有什么意义。 – Lamak 2014-09-12 19:40:52

+1

问题是,您的联接会影响连接的行数增加。但是,无法修复查询,因为不清楚列的来源。 – 2014-09-12 19:46:59

回答

0

该问题已通过规范化数据库得以解决。 mmr_notes表已集成到mmr_hoursWorked表中,因为它只有一个唯一字段。

0

由于JOIN由于语句组合结果被返回,所以你应该分别处理聚合和连接。试试这个:

SELECT t.* 
FROM 
(
    SELECT mmr_ID, mmr_projectName, SUM(mmr_hoursWorked.mmr_hoursWorked_hours) AS sumHours 
    FROM mmr 
    LEFT JOIN mmr_hoursWorked 
    ON mmr.mmr_ID = mmr_hoursWorked.mmr_hoursWorked_project AND mmr_hoursWorked.mmr_hoursWorked_mm = 'P90826' 
    WHERE mmr_projectStatus != 1 AND mmr_mmAssigned = 'P90826' 
    GROUP BY mmr_ID, mmr_projectName, mmr_mmAssigned 
) t 
LEFT JOIN mmr_notes 
ON t.mmr_ID = mmr_notes.mmr_notes_MMR_ref 
WHERE mmr_notes.mmr_notes_author = 'P90826'; 
+0

解决方案提供冗余记录 - 可能在正确的位置添加UNIQUE语句会移动冗余记录?虽然这次正确地完成了小时数。一种不同的方法为这个问题提供了解决方案。 – ck706 2014-09-15 19:19:05