2013-05-08 104 views
0
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 

它显示此使用Sum聚合

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时需要ID列不显着。

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

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 
+0

'p.ProjectID = e.EmployeeID'有点可疑。首先,这意味着至多有一名员工可以参与项目。 – Andomar 2013-05-08 05:39:25

+0

你是对的,所以我通过其他表来连接表。 – user2268697 2013-05-08 17:55:46

回答

2

NULLs值表示这2名员工没有任何项目。通过换句话说,不存在有项目编号4,5

3

u可以使用此查询:因为你的专案编号等于员工ID

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 

,然后如果连接返回NULL的专案编号我们可以使用employeeid而不是

+0

这给了projectID 4和5,并且没有任何具有该值的projectID。员工编号1和2是项目编号1,员工编号2和3是项目编号2,员工编号3是项目编号3 – user2268697 2013-05-08 17:17:48

+0

这使我获得了大部分的方式,仍然存在ProjectID和employeeID之间的单一连接问题,我解决了。 – user2268697 2013-05-08 17:56:39

0

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