MySQL - 如何将列数据合并为一行

时间:2014-08-19 12:16:05

标签: mysql

我正在制作一份员工出勤记录,但我很难合并 原始数据分为时间和超时组合格式。

从下面给出的“原始数据”表中 我需要将员工的时间和时间合并为一行 比如下面的“合并时间进/出”示例。

还要考虑员工在白班和夜班有两个班次。 请注意,如果员工在夜班时间表中 超时日期与日期时间不同。

日班转换(ID001,ID002) 夜班empid(ID003)

Raw Data Table
--------------------------------------------
empid      date      time[in/out] in_out
--------------------------------------------
ID001     2014-08-01   7:00am       IN
ID002     2014-08-01   7:01am       IN
ID003     2014-08-01   8:05pm       IN   <--Night Shift

ID001     2014-08-01   5:00pm       OUT
ID002     2014-08-01   5:01pm       OUT
ID003     2014-08-02   6:01am       OUT  <--take note of date


Merge Time in/out Table
--------------------------------------------
empid      date       time_in       time_out
--------------------------------------------
ID001     2014-08-01   7:00am       5:00pm
ID002     2014-08-01   7:01am       5:01pm
ID003     2014-08-01   8:05pm       6:01am

3 个答案:

答案 0 :(得分:4)

select r1.empid, 
       r1.date, 
       r1.time as time_in, 
       r2.time as time_out
from raw_Data r1
inner join raw_data r2   on r1.empid = r2.empid 
where r1.in_out = 'IN' 
  and r2.in_out = 'OUT';

答案 1 :(得分:2)

好的,所以当他的time_out是AM时,你可以判断这位员工是否在夜班工作。在这种情况下,它是最后一行的情况。

enter image description here

我所做的是确定一个真实的日期字段。这是你从夜班出来的前一天,以及任何其他情况下的当前日期

select empid, 
       IF(RIGHT(timeinout,2)='am' AND in_out='OUT',
          DATE_ADD(date, INTERVAL -1 DAY),
          date) as realdate,
       MAX(if(in_out='IN',timeinout,null)) as time_in, 
       MAX(if(in_out='OUT',timeinout,null)) as time_out 
from shifts 
group by empid, realdate

输出

enter image description here

取决于表的大小,使用这种方式可能值得为自己保存连接。在几乎任何其他情况下,联接更清晰。

我猜您无法控制输入的格式,因此您必须坚持使用文本作为时间并对最后2个字符中的am / pm后缀进行比较。我觉得这很容易出错,但让我们祈祷原始数据会坚持这种格式。

这个解决方案做了一些假设,我宁愿在这里解释,以避免进一步的误解

  • 如果工人在白班工作,工人就不能上夜班(因为我们按日期分组,你需要一个额外的字段来区分某一天的白班和夜班)< / LI>
  • 输入永远不会比给定日期/员工元组的IN时间更早列出OUT时间(如果发生这种情况,则需要额外的验证步骤来保证输出的一致性)
  • 输入将始终包含给定班次的timein和timeout(如果没有,则需要额外的步骤来丢弃orfan timeentries)。

答案 2 :(得分:1)

尝试此查询并告诉我它是否有效

SELECT empid, 
       date, 
       MAX(CASE WHEN in_out = 'IN' THEN time ELSE '' END) time_in, 
       MAX(CASE WHEN in_out = 'OUT' THEN time ELSE '' END) time_out
FROM  Raw Data
GROUP BY empid, date