使用Sum聚合时,需要ID列不相同

时间:2013-05-08 04:36:35

标签: mysql sql join aggregate-functions

SELECT s.EmployeeID,e.LastName,projectID,sum(s.HoursWorked) AS Total_Hours
from TimeSheet s
full join Employee e ON e.EmployeeID = s.EmployeeID
full Join Project p
ON p.ProjectID = e.EmployeeID 
group by p.ProjectID,s.EmployeeID,e.LastName

显示此内容

Employeid  Lastname        projectID    Sum(hoursWorked)
4          Peacock          NULL         33.00
5          Buchanan         NULL         44.00
1          Davolio          1            56.00
2          Fuller           2            41.00
3          Leverling        3            42.00

我希望项目ID显示为2 NULLS。

更新:这几乎是我所需要的。

SELECT  COALESCE(et.EmployeeID, p.projectID) AS employeeID
,       e.LastName
,       COALESCE(p.projectID, et.EmployeeID) AS projectID
,       sum(s.HoursWorked) AS Total_Hours
from    TimeSheet s  
inner join Employee e ON e.EmployeeID = s.EmployeeID
inner join EmployeeTask et on e.EmployeeID = et.EmployeeID
inner join Task t On t.TaskID=et.TaskID
inner join Project p on p.ProjectID=t.ProjectID 
group by p.ProjectID, et.EmployeeID, e.LastName

这会产生

Employeid  Lastname        projectID    Sum(hoursWorked)
1          Davolio          1   112.00
2          Fuller           1   82.00
3          Leverling        2   84.00
4          Peacock          2   66.00
5          Buchanan         3   88.00

请告诉我这个链接Using multiple JOINS. SUM() producing wrong value

更新答案:然后我重写了我的sql以获得正确的答案。

SELECT  COALESCE(et.EmployeeID, p.projectID) AS employeeID
,       COALESCE(p.projectID, et.EmployeeID) AS projectID
,       e.LastName
,       (Select sum(HoursWorked)
    FROm TimeSheet
    WHere TimeSheet.EmployeeID=e.EmployeeID
    )AS Total_Hours
from    TimeSheet s  
inner join Employee e ON e.EmployeeID = s.EmployeeID
inner join EmployeeTask et on e.EmployeeID = et.EmployeeID
inner join Task t On t.TaskID=et.TaskID
inner join Project p on p.ProjectID=t.ProjectID 
group by p.ProjectID, et.EmployeeID, s.EmployeeID,e.EmployeeID, e.LastName

3 个答案:

答案 0 :(得分:3)

你可以使用这个查询:

SELECT  COALESCE(s.EmployeeID, projectID) AS employeeID
,       e.LastName
,       COALESCE(projectID, s.EmployeeID) AS projectID
,       sum(s.HoursWorked) AS Total_Hours
from    TimeSheet s  
full join Employee e ON e.EmployeeID = s.EmployeeID
full Join Project p ON p.ProjectID = e.EmployeeID
group by p.ProjectID, s.EmployeeID, e.LastName

因为你的projectid等于employee id,那么如果join为ProjectID返回null,我们可以使用employeeid代替

答案 1 :(得分:2)

NULLs值表示这2名员工没有任何项目。换句话说,没有id为4,5的项目

答案 2 :(得分:0)

从您的数据库结构中,我假设一名员工正在为一个项目工作,而所有时间表仅注册该项目。我个人认为这不是一个很好的数据库设置。它可能不会用于在实际项目中存储实际数据。

相关问题