【问题标题】:Select employee number who worked most hours选择工作时间最长的员工编号
【发布时间】:2013-10-06 16:32:32
【问题描述】:

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

分配表:

+-----------+----------------+-------------+
| 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 的任何想法?

【问题讨论】:

  • 在组中添加员工编号,您错过了。

标签: mysql sql


【解决方案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 和最大工作时间,将其内部连接回员工/分配查询。这起到过滤器的作用,只留下 projectID 工作的最大小时数。此方法的额外好处是,当 2 个人的工作时间相同时,为一个项目返回两行。

顺便说一句...您看到的当前行为的原因完全是 MYSQL。大多数其他引擎会直接返回一个错误,指出employeeID 不是group by 语句的一部分并且在那里失败。 MYSQL 出于某种原因认为没问题并随机带回其中一个employeeID(或任何未在组中正确指定的字段)

编辑:

如果我们不在 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 中限制的 %^%@$%

【讨论】:

  • 您创建的视图返回此错误:ERROR 1349 (HY000): View's SELECT contains a subquery in the FROM 子句
  • ...我忘了 MYSQL 有这个错误。 stackoverflow.com/questions/8428641/…那里列出的解决方案是将我在子选择中创建的qry变成一个视图并引用它。我会编辑答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-01
  • 1970-01-01
  • 2021-12-15
  • 2012-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多