【问题标题】:MySQL - How to combine the column data into one rowMySQL - 如何将列数据组合成一行
【发布时间】:2014-10-12 12:58:38
【问题描述】:

我正在制作员工出勤记录,但无法合并 原始数据转换成time in和time out组合格式。

来自下面给定的“原始数据”表 我需要将员工的进出时间合并为一行 就像下面的“合并时间输入/输出”示例。

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

白班empid(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

【问题讨论】:

  • 那么你想在日期列中存储什么日期(合并时间输入/输出表)?
  • 你确定这个数据集能恰当地代表手头的问题吗?
  • 我知道夜班是个特例。我试图在我的回答中反映这一点,但我不确定我是否理解你想要解释的内容。

标签: mysql


【解决方案1】:
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';

【讨论】:

    【解决方案2】:

    试试这个查询并告诉我它是否有效

    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
    

    【讨论】:

      【解决方案3】:

      好的,因此您可以判断该员工是否在他的超时时间是上午时上夜班。在这种情况下,它是最后一行的情况。

      我所做的是确定一个真实的日期字段。是你下夜班的前一天,其他情况下是当前日期

      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
      

      输出

      根据表的大小,可能值得使用这种方式来节省自己的连接。在几乎任何其他情况下,连接都更简洁。

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

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

      • 如果工人上白班,他们就不能上夜班(由于我们按日期分组,您需要一个额外的字段来区分给定日期的白班和夜班)
      • 对于给定的日期/员工元组,输入永远不会列出早于 IN 时间的 OUT 时间(如果发生这种情况,则需要额外的验证步骤来保证输出的一致性)
      • 输入将始终包括给定班次的 timein 和 timeout(如果没有,您将需要一个额外的步骤来丢弃或取消时间条目)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-06-26
        • 1970-01-01
        • 2021-08-17
        • 2020-01-01
        • 2020-12-25
        • 2014-06-04
        • 2021-10-06
        相关资源
        最近更新 更多