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

MySQL-如何将列数据合并成一行,mysql,Mysql,我正在做一个员工考勤记录,我无法合并 将原始数据转换为时间输入和时间输出组合格式 根据下面给定的“原始数据”表 我需要将员工的进出时间合并到一行中 如下面的“合并时间输入/输出”示例 也考虑员工有两个换班时间表:日班和夜班。 请注意,如果员工在上夜班 超时日期与进入日期不同 白班empid(ID001、ID002) 夜班empid(ID003) 原始数据表 -------------------------------------------- empid日期时间[输入/输出]输入/输出 ---

我正在做一个员工考勤记录,我无法合并 将原始数据转换为时间输入和时间输出组合格式

根据下面给定的“原始数据”表 我需要将员工的进出时间合并到一行中 如下面的“合并时间输入/输出”示例

也考虑员工有两个换班时间表:日班和夜班。 请注意,如果员工在上夜班 超时日期与进入日期不同

白班empid(ID001、ID002) 夜班empid(ID003)

原始数据表
--------------------------------------------
empid日期时间[输入/输出]输入/输出
--------------------------------------------
ID001 2014-08-01上午7:00在伦敦
ID002 2014-08-01上午7时01分

ID003 2014-08-01 8:05pm IN尝试此查询并告诉我它是否有效

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

好的,那么你可以知道员工是否在上午下班时上夜班。在这种情况下,这是最后一行的情况

我所做的是确定一个真正的日期字段。这是你上夜班的前一天,在任何其他情况下都是当前日期

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后缀进行比较。我发现这很容易出错,但让我们祈祷原始数据将坚持这种格式

这个解决方案提出了一些假设,我在这里解释这些假设是为了避免进一步的误解

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

那么您希望在日期列(合并时间输入/输出表)中存储什么日期?您确定此数据集正确地代表了当前的问题吗?我知道夜班是一种特殊情况。我试图在我的回答中反映这一点,但我不确定我是否理解你试图解释的内容。
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
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