Mysql 使用总和聚合时需要ID列不区分
哪个显示这个Mysql 使用总和聚合时需要ID列不区分,mysql,sql,join,aggregate-functions,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 我希
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
我希望项目ID显示为2个空值
更新:这几乎是我需要的
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
这就产生了
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
这让我找到了这个链接
更新答案:然后我重写sql以获得正确答案
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
NULLs值表示这2名员工没有任何项目。换句话说,没有一个项目id为4,5,表示这两名员工没有任何项目。换句话说,没有id为4,5的项目可以使用此查询:
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
因为您的projectid等于员工id,所以如果projectid的联接返回null,我们可以使用employeeid来代替
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
由于您的projectid等于员工id,因此如果projectid的联接返回null,我们可以使用数据库结构中的employeeid,我假设一名员工正在为一个项目工作,并且所有时间表仅为该项目注册。我个人认为这不是一个好的数据库设置。它可能不用于在real project中存储真实数据。根据您的数据库结构,我假设一名员工正在为一个项目工作,并且所有时间表仅为该项目注册。我个人认为这不是一个好的数据库设置。它可能不用于在real project中存储真实数据。
p.projectd=e.EmployeeID
有点可疑。首先,这意味着一个项目最多只能有一名员工工作。你是对的,所以当我通过其他表连接表时,我有点怀疑。首先,这意味着最多一名员工可以处理一个项目。你是对的,所以我在通过其他表连接表时,给出了projectID 4和projectID 5,没有任何projectID具有该值。员工id 1和2是项目id 1,员工id 2和3是项目id 2,员工id 3是项目id 3这让我大吃一惊,仍然存在ProjectID和employeeID之间的单一连接问题,我解决了这个问题。这给出了ProjectID 4和5,并且没有任何具有该值的ProjectID。员工id 1和2是项目id 1,员工id 2和3是项目id 2,员工id 3是项目id 3这让我大吃一惊,ProjectID和employeeID之间仍然存在单一连接的问题,我解决了这个问题。