SQL Query添加不同的表数据

时间:2015-09-03 04:32:12

标签: mysql

我有两张表,其中有几列是他们的,例如 task_master和logtime。

Taskmaster表包含以下列:

taskid
Actualhours
AssignedTo
createdDate
EmployeeHours
PlannedHours
status, 
task_name
task_key

Logtime表格如下:

logid
date
empolyeid
hours
remarks
taskid

所以我的问题是,是否有一名员工已完成多项任务 例如:ABC曾在taskid 1,2,3工作,而taskid 2已经花了5个小时,EFG已经在taskid 2,3,4工作了,而对于taskid 2,他花了14个小时, 我的问题是我要计算两个或更多的实际小时数,而不是相同的任务。 所以我的Actualhours应该是19个小时.. 提前谢谢。

我尝试了这个命令,但是它给了我employeeid的输出,他已经处理了一些taskid,但我想知道所有员工花了多少时间来完成某项任务

SELECT
    logtime.employeeId
  , logtime.taskId
  , sum(hours) as EmployeeHours
  , task_master.Task_Key
  , task_master.ActualHours
  , task_master.Task_Name
  , task_master.AssignedToInJira
  , task_master.CreatedDate
  , task_master.UpdatedDate
  , task_master.Status
  , task_master.PlannedHours
  , task_master.Task_Description 
FROM logtime join task_master 
where logtime.taskId=task_master.taskId 
and logtime.employeeId=4 
GROUP By taskId,employeeId 
limit 0,1000

3 个答案:

答案 0 :(得分:1)

如果我理解正确,您希望员工在给定任务中工作的所有小时数总和,对吗?

如果是,那么你可以这样做:

 CREATE VIEW ACTUAL_HOURS AS
select taskid, sum(hours) as actual_hours
 from logtime
 group by taskid
 order by taskid;

然后,您通过taskid与task_master加入此视图。

答案 1 :(得分:0)

尝试这样

SELECT logtime.employeeId,logtime.taskId,sum(hours) as EmployeeHours,
task_master.Task_Key,task_master.ActualHours,task_master.Task_Name‌
​,task_master.AssignedToInJira,task_master.CreatedDate,
task_master.UpdatedDate,tas‌k_master.Status,task_master.PlannedHours,
ta.totalhours,
task_master.Task_Description FROM logtime join task_master on  
logtime.taskId=task_master.taskId join 
(select sum(hours) as totalhours ,taskId from logtime group by taskId) 
as ta on ta.taskId=task_master.taskId where
logtime.employeeId=4 GROUP By taskId,
employeeId limit 0,1000

答案 2 :(得分:0)

如果您不希望在结果中使用employeeid,则不要将其包含在查询中。特别是不要将它包含在GROUP BY子句中,因为您将在每个taskid上为每个employeeid获取一个新行

SELECT
      logtime.taskId
    , SUM(logtime.hours) AS EmployeeHours
FROM logtime
      JOIN task_master ON logtime.taskId = task_master.taskId
WHERE logtime.employeeId = 4
GROUP BY
      logtime.taskId
;

例如,如果查询在之后看起来像这样,您将获得更多行

SELECT
      logtime.employeeId
    , logtime.taskId
    , SUM(logtime.hours) AS EmployeeHours
FROM logtime
      JOIN task_master ON logtime.taskId = task_master.taskId
WHERE logtime.employeeId = 4
GROUP BY
      logtime.employeeId
    , logtime.taskId
;

现在:因为你使用MySQL,你需要了解一些东西。 MySQL允许"捷径"在GROUP BY的语法中,你永远不应该使用那个捷径。有关详细信息:https://dev.mysql.com/doc/refman/5.0/en/group-by-handling.html此"扩展程序"建议不要使用MySQL中的GROUP BY。

因此:对于不使用聚合函数的每一列,您需要在GROUP BY子句中包含该列。

因此,如果您想要更多列,例如任务名称,那么查询将如下所示:

SELECT
      logtime.taskId
    , task_master.Task_Key
    , task_master.Task_Name
    , task_master.AssignedToInJira
    , task_master.CreatedDate
    , task_master.UpdatedDate
    , task_master.Status
    , task_master.PlannedHours
    , task_master.Task_Description
    , SUM(logtime.hours) AS EmployeeHours
FROM logtime
      JOIN task_master ON logtime.taskId = task_master.taskId
WHERE logtime.employeeId = 4
GROUP BY
      logtime.taskId
    , task_master.Task_Key
    , task_master.Task_Name
    , task_master.AssignedToInJira
    , task_master.CreatedDate
    , task_master.UpdatedDate
    , task_master.Status
    , task_master.PlannedHours
    , task_master.Task_Description
;

但是,要小心一点,因为GROUP BY中包含的每一列都可能会增加行数。