2012-08-29 20 views
0
RCDID, EmployeeID, LogDate, LogTime, TerminalID, InOut, read 

3079184, 'A00075', '2009/10/28', '07:17:10 ', 'VC01 ', 'IN  ', '1' 
3079185, 'A00075', '2009/10/28', '17:28:51 ', 'VC01 ', 'OUT  ', '1' 
3079186, 'A00038', '2009/10/28', '07:29:17 ', 'VC01 ', 'IN  ', '1' 
3079187, 'A00038', '2009/10/28', '17:30:05 ', 'VC01 ', 'OUT  ', '1' 
3079188, 'A00085', '2009/10/28', '07:37:34 ', 'VC01 ', 'IN  ', '1' 
3079189, 'A00085', '2009/10/28', '17:43:14 ', 'VC01 ', 'IN  ', '1' 

嗨,上面是我的源表(mysql)我想交叉选项卡的数据如下。PIVOT mysql中的数据

EmployeeID, LogDate, In_location, in_time, Out_location, Out_time 
'A00001', '2009/10/28', 'VC01', '08:37:55 ', '', '', 
'A00001', '2009/10/29', 'VC01', '08:09:57 ', 'VC01   ', '17:09:32 ' 
'A00001', '2009/10/30', 'VC01 ', '09:48:41 ', 'VC01   ', '20:40:37 ' 
'A00001', '2009/11/03', 'VC01', '08:20:34 ', 'VC01   ', '18:03:34 ' 
'A00001', '2009/11/04', 'VC01 ', '08:26:49 ', 'VC01   ', '19:21:46 ' 
'A00001', '2009/11/05', 'VC01', '08:16:00 ', 'VC01   ', '19:26:01 ' 

有人可以帮助我。我真的很感谢你的帮助

回答

1

从本质上讲,需要进行自连接到具有以下OUT由同一名员工在同一日期配对运动IN

SELECT a.EmployeeID, a.LogDate, 
     a.LogTime AS In_time, 
     MIN(b.LogTime) AS Out_time 
FROM  my_table a LEFT JOIN my_table b ON 
     a.EmployeeID = b.EmployeeID 
    AND a.LogDate = b.LogDate 
    AND a.LogTime < b.LogTime 
    AND b.InOut  = 'OUT' 
WHERE a.InOut  = 'IN' 
GROUP BY EmployeeID, LogDate, In_time 

然而,这排除情况其中有IN记录,没有对应的OUT记录。由于MySQL有用于FULL OUTER JOIN没有原生支持,我们需要使用UNION上面有一个类似的查询合并是对运动OUT与在同一日期同一员工前面IN

SELECT a.EmployeeID, a.LogDate, 
      a.LogTime AS In_time, 
      MIN(b.LogTime) AS Out_time 
    FROM  my_table a LEFT JOIN my_table b ON 
      a.EmployeeID = b.EmployeeID 
     AND a.LogDate = b.LogDate 
     AND a.LogTime < b.LogTime 
     AND b.InOut  = 'OUT' 
    WHERE a.InOut  = 'IN' 
    GROUP BY EmployeeID, LogDate, In_time 

UNION 

    SELECT a.EmployeeID, a.LogDate, 
      MAX(a.LogTime) AS In_time, 
      b.LogTime AS Out_time 
    FROM  my_table a RIGHT JOIN my_table b ON 
      a.EmployeeID = b.EmployeeID 
     AND a.LogDate = b.LogDate 
     AND a.LogTime < b.LogTime 
     AND a.InOut  = 'IN' 
    WHERE b.InOut  = 'OUT' 
    GROUP BY EmployeeID, LogDate, Out_time 

在获得这个细节,一个则需要与表加入结果再次以提取其上的动作被记录的终端:

SELECT t.EmployeeID, 
     t.LogDate, 
     a.TerminalID AS In_location, 
     t.In_time, 
     b.TerminalID AS Out_location, 
     t.Out_time 
FROM (

    SELECT a.EmployeeID, a.LogDate, 
      a.LogTime AS In_time, 
      MIN(b.LogTime) AS Out_time 
    FROM  my_table a LEFT JOIN my_table b ON 
      a.EmployeeID = b.EmployeeID 
     AND a.LogDate = b.LogDate 
     AND a.LogTime < b.LogTime 
     AND b.InOut  = 'OUT' 
    WHERE a.InOut  = 'IN' 
    GROUP BY EmployeeID, LogDate, In_time 

UNION 

    SELECT a.EmployeeID, a.LogDate, 
      MAX(a.LogTime) AS In_time, 
      b.LogTime AS Out_time 
    FROM  my_table a RIGHT JOIN my_table b ON 
      a.EmployeeID = b.EmployeeID 
     AND a.LogDate = b.LogDate 
     AND a.LogTime < b.LogTime 
     AND a.InOut  = 'IN' 
    WHERE b.InOut  = 'OUT' 
    GROUP BY EmployeeID, LogDate, Out_time 

) t 

    LEFT JOIN my_table a ON 
     a.EmployeeID = t.EmployeeID 
    AND a.LogDate = t.LogDate 
    AND a.LogTime = t.In_time 
    AND a.InOut  = 'IN' 

    LEFT JOIN my_table b ON 
     b.EmployeeID = t.EmployeeID 
    AND b.LogDate = t.LogDate 
    AND b.LogTime = t.Out_time 
    AND b.InOut  = 'OUT' 

看到它的sqlfiddle

+0

哇,它工作的感谢, – Chali

+1

@Chali:没问题。也许你会好心遵循[@ Omesh的建议](http://stackoverflow.com/questions/12172342/pivot-data-in-mysql/12173629#comment16292872_12172342)和[接受答案](http:// meta .stackexchange.com/a/5235)可以解决您的问题,甚至可以[upvote](http://stackoverflow.com/privileges/vote-up)查看它们是否有用或有用。 – eggyal