查询员工的空闲时间

时间:2013-02-26 07:19:15

标签: php mysql group-by aggregate-functions

我是PhP的初学者请帮我完成以下要求。

我有一个有

的数据库表
EMPLOYEECODE JOBCODE STARTTIME(in float)  ENDTIME(in float)
1001          01       09.5101                12.1545
1001          01       13.255                 14.525
1001          02       15.000                 16.525
1002          01       09.000                 12.1058
1002          02       13.00                  17.1254

我希望让每个员工在每个工作岗位上闲置时间,并让员工的总闲置时间显示如下表所示

EMPLOYEECODE  JOBCODE   IdleTime(HH:MM)   TotalIdleTime(HH:MM)
1001           01           ?                     ?
1001           01           ?                     ?
1001           02           ?                     ?
1002           01           ?                     ?
1002           02           ?                     ?
上表数据中的

将显示类似

的内容
EMPLOYEECODE  JOBCODE                  IdleTime(HH:MM)           TotalIdleTime(HH:MM)
1001           (last worked)02         idle time on last job     total idle time of 1001 

所有工作

1 个答案:

答案 0 :(得分:1)

以下查询适用于MySQL,因为它会滥用MySQL始终选择非聚合列的第一个(而非任意位置)值的事实(因此内心ORDER BY),更不用说偶然SELECT后者了。

see this SQL Fiddle

  SELECT x.EMPLOYEECODE
       , MAX(x.JOBCODE) AS JOBCODE
       , x.IdleTime
       , SUM(x.IdleTime) AS TotalIdleTime
    FROM ( SELECT EMPLOYEECODE
                , JOBCODE
                , SUM(ENDTIME - STARTTIME) AS IdleTime
             FROM employee
         GROUP BY EMPLOYEECODE, JOBCODE
         ORDER BY EMPLOYEECODE ASC, JOBCODE DESC ) AS x
GROUP BY x.EMPLOYEECODE
ORDER BY x.EMPLOYEECODE ASC

这就是文档所说的内容:

  

MySQL扩展了GROUP BY的使用,以便选择列表可以引用   未在GROUP BY子句中命名的非聚合列。这意味着   前面的查询在MySQL中是合法的。您可以使用此功能   通过避免不必要的列排序来获得更好的性能   分组。但是,这主要适用于每个中的所有值   GROUP BY中未命名的非聚合列对于每个列都是相同的   基。

     

服务器可以自由选择每个组中的任何值,所以   除非它们相同,否则所选择的值是不确定的。   此外,不能从每个组中选择值   受添加ORDER BY子句的影响。对结果集进行排序   选择值后发生,ORDER BY不影响   服务器选择的值。

第二段(我强调)似乎与我的陈述相矛盾,但我从未遇到过不符合上述规则的结果(即选择第一个可用值)。除了内部ORDER BY确实发生在外部选择发生之前,因此允许查询返回正确的值。