选择工作时间最长的员工编号

时间:2013-09-30 17:47:09

标签: mysql sql

我正在尝试选择在每个项目上工作时间最长的员工,但是它只是为每个项目ID选择第一个属性。

作业表:

+-----------+----------------+-------------+
| ProjectID | EmployeeNumber | HoursWorked |
+-----------+----------------+-------------+
|      1000 |              1 |       30.00 |
|      1000 |              8 |       75.00 |
|      1000 |             10 |       55.00 |
|      1100 |              4 |       40.00 |
|      1100 |              6 |       45.00 |
|      1200 |              1 |       25.00 |
|      1200 |              2 |       20.00 |
|      1200 |              4 |       45.00 |
|      1200 |              5 |       40.00 |
|      1300 |              1 |       35.00 |
|      1300 |              8 |       80.00 |
|      1300 |             10 |       50.00 |
|      1400 |              4 |       15.00 |
|      1400 |              5 |       10.00 |
|      1400 |              6 |       27.50 |
+-----------+----------------+-------------+

我的视图表显示了每个项目工作时间最长的员工:

+----------------+-------+-----------+
| EmployeeNumber | MAX   | ProjectID |
+----------------+-------+-----------+
|              1 | 75.00 |      1000 |
|              4 | 45.00 |      1100 |
|              4 | 45.00 |      1200 |
|              1 | 80.00 |      1300 |
|              4 | 27.50 |      1400 |
+----------------+-------+-----------+

有关为什么显示员工编号1,4,4,1,4而不是8,6,4,8,6的任何想法?

1 个答案:

答案 0 :(得分:1)

不确定是否有任何答案。

Select project_id , max(hoursworked) 
FROM Assignment AS A JOIN Employee AS E
ON A.EmployeeNumber = E.EmployeeNumber
GROUP BY A.PROJECTID

此查询告诉您项目的最长工作时间是多少。将其加入到查询中以获取执行此操作的员工ID。

CREATE VIEW MostHours AS
SELECT E.EmployeeNumber, qry.hoursworked, ProjectID
FROM Assignment AS A JOIN Employee AS E
ON A.EmployeeNumber = E.EmployeeNumber
inner join 
   ( Select project_id , max(hoursworked) hoursworked
    FROM Assignment AS A JOIN Employee AS E
    ON A.EmployeeNumber = E.EmployeeNumber
    GROUP BY A.PROJECTID) qry
on a.projectID = qry.projectid and a.hoursworked = qry.hoursworked

我认为这就是语法...对不起我没有一个mysql区域来测试它。逻辑很简单...使用子查询来查找projectID和max hoursworked,将内部联接回到employee / assignment查询。这可以作为一个过滤器,只剩下projectID最多工作时间。这种方法的另一个好处是,当2个人的工作时间相同时,为项目返回两行。

顺便说一下......你所看到的当前行为的原因完全是MYSQL。大多数其他引擎会变平,返回一个错误,说employeeID不是group by语句的一部分而且在那里失败。 MYSQL由于某种原因决定它可以随机带回一个employeeID(或者cluase在组中没有正确指定的任何字段)

编辑:

如果我们不在MYSQL中,那将会奏效。解决方法是两个视图而不是一个...查看我最近评论中的链接:

 Create view maxmosthours AS
    Select project_id , max(hoursworked) hoursworked
    FROM Assignment AS A JOIN Employee AS E
    ON A.EmployeeNumber = E.EmployeeNumber
    GROUP BY A.PROJECTID

CREATE VIEW MostHours AS
SELECT E.EmployeeNumber, qry.hoursworked, ProjectID
FROM Assignment AS A JOIN Employee AS E
ON A.EmployeeNumber = E.EmployeeNumber
inner join maxmosthours qry
on a.projectID = qry.projectid and a.hoursworked = qry.hoursworked

MYSQL中有一个%^%%的限制