我曾经来过这里,得到了极大的帮助: mysql group by returning incorrect result
我现在遇到一个类似的Query,它有一个附加表: 这里是小提琴http://sqlfiddle.com/#!2/7fe40/5
有3个表:项目,任务和时间表 Task表有一个外键(project_id),它链接回Parent Project,它还包含一个“赋值小时”的值。 时间表表格包含“actual_hours”和用户名。
我想要做的是SUM在每个项目上花了多少实际小时数。 此查询返回不正确和随机的结果:
SELECT DISTINCT
`timesheet`.`name`,
SUM(`timesheet`.`hours`) AS `total_hours`,
`project`.`project_name`,
`task`.`task_name`,
SUM(`task`.`hrs`) AS `assigned_hours`
FROM
`task`
INNER JOIN `project` ON (`task`.`project_id` = `project`.`project_id`)
INNER JOIN `timesheet` ON (`task`.`task_id` = `timesheet`.`task_id`)
GROUP BY
`project`.`project_name`
非常感谢任何帮助。
谢谢
答案 0 :(得分:1)
Mysql支持非标准分组。修复方法是按所有非聚合选定列进行分组:
...
GROUP BY `timesheet`.`name`, `project`.`project`, `task`.`task_name`
您还应该删除DISTINCT
关键字。
在mysql 中只有(所有其他数据库都会引发异常),按少于所有非聚合列进行分组会导致按列分组的每个唯一组合的随机行(尽管在实践中,它不是一个随机行,而是第一行遇到 - YMMV是你依赖于此。)
答案 1 :(得分:0)
如果您只想要项目的总和,为什么要包括这些任务?
SELECT SUM(ts.`hours`) AS `total_hours`,
p.`project_name`,
SUM(t.`hrs`) AS `assigned_hours`
FROM `task` t INNER JOIN
`project` p
ON t.`project_id` = p.`project_id`) INNER JOIN
`timesheet` ts
ON t.`task_id` = ts.`task_id`
GROUP BY p.`project_name`;
我有一种感觉,虽然这可能会给出不准确的结果,因为每个任务可能有多个时间表记录。所以你可以尝试:
SELECT SUM(ts.total_hours) AS `total_hours`,
p.`project_name`,
SUM(t.`hrs`) AS `assigned_hours`
FROM `task` t INNER JOIN
`project` p
ON t.`project_id` = p.`project_id` INNER JOIN
(select ts.task_id, sum(ts.hours) as total_hours
from `timesheet` ts
group by ts.task_id
) ts
ON t.`task_id` = ts.`task_id`
GROUP BY p.`project_name`;
Here是一个SQL小提琴。