我怎样才能得到一列的总和?

时间:2014-06-02 10:49:39

标签: mysql sql

我有3个表:活动,目标和要求。我想返回特定要求的所有任务的所有持续时间。这是我的问题:

enter image description here

SELECT r.id as req_id, 
       r.project_id,
       r.name as req_name, 
       r.cost,r.estimated, 
       p.name as project_name, 
       v.name AS `status` , 
       t.taskid, 
       (SELECT SEC_TO_TIME(SUM(TIME_TO_SEC(duration))) 
        FROM activities a   
        WHERE a.taskid = t.taskid) AS worked
FROM requirements r  
INNER JOIN projects p  
ON p.projectid = r.project_id
INNER JOIN `values` v 
ON v.id = r.r_status_id
LEFT JOIN tasks t
on t.id_requirement = r.id
WHERE 1 = 1 
ORDER BY req_id  desc

这就是结果: enter image description here

正如您所看到的,有两个相同的req_id(48)。我想出现一次,得到worked中最后两行的总和。我该如何管理? 这是活动结构: enter image description here

这是任务结构: enter image description here

这是需求结构: enter image description here

2 个答案:

答案 0 :(得分:1)

将您的活动表包含在您需要的所有需求列的JOIN,GROUP中,并添加总和。由于您正在聚合任务,因此您无法在SELECT子句中使用taskid。

SELECT r.id as req_id, 
       r.project_id,
       r.name as req_name, 
       r.cost,r.estimated, 
       p.name as project_name, 
       v.name AS `status` , 
       SEC_TO_TIME(SUM(TIME_TO_SEC(a.duration))) 
FROM requirements r  
    INNER JOIN projects p ON p.projectid = r.project_id
    INNER JOIN `values` v ON v.id = r.r_status_id
    LEFT JOIN tasks t ON t.id_requirement = r.id
    LEFT JOIN activities a ON a.taskid=t.taskid
WHERE 1 = 1 
GROUP BY r.id, r.project_id, r.name,r.cost,r.estimated,p.name, v.name
ORDER BY req_id  desc

答案 1 :(得分:0)

查询中的联接似乎是在创建额外的行。我确信有一种方法可以直接修复逻辑,可能是通过在from子句中预先聚合一些结果。

您的副本似乎是完全重复的(每列完全相同)。解决问题的简便方法是使用select distinct。因此,只需使用以下命令开始查询:

SELECT DISTINCT r.id as req_id, r.project_id, r.name as req_name, 
. . .

我怀疑你的一个基础表有重复的行,你不期望,但这是另一个问题。