Mysql - 在日期行到列

时间:2014-07-12 00:22:29

标签: mysql

我想我需要一点帮助......这是一个时间段。行需要每天转换为列。下面是一个示例表和我想要获得的结果。

需要考虑的其他问题:
- 有时人们会忘记时钟。
- 有时候人们可能会在同一天多次上下班次

这是我的表格:  表A

+-------+-----------+-----------------------+---------+
| ID    | User_id   |   DateTime            | inorout |
+-------+-----------+-----------------------+---------+
| 1     |   5       |   2014-07-10 12:50:00 |   1     |
| 2     |   5       |   2014-07-10 17:40:00 |   0     |
| 3     |   5       |   2014-07-11 01:40:00 |   1     |
| 4     |   5       |   2014-07-11 02:50:00 |   0     |
| 5     |   5       |   2014-07-12 03:20:00 |   1     |
+-------+-----------+-----------------------+---------+

1代表In,0代表Out

这是我想要获得的结果: - User_id 5的结果

ID  In                      Out                     Hours worked 
1   2014-07-10 12:50:00     2014-07-10 17:55:00     5:05 
2   2014-07-11 01:40:00     2014-07-11 02:50:00     1:10 
3   2014-07-12 03:20:00     NULL                    NULL 

谢谢!

1 个答案:

答案 0 :(得分:0)

我相信这会为你想要的东西做点什么......基本上你想在桌子上使用一个支点但是有一种方法可以实现这个而不用实际的支点!像这样......

SELECT 
    id, 
    Login, 
    Logout,
    TIMESTAMPDIFF(MINUTE, Login, Logout) / 60 as 'Hours Worked'
FROM(
    SELECT id, 
        MAX(IF(inorout = 1, DateTime, NULL)) AS Login,
        MAX(IF(inorout = 0, DateTime, NULL)) AS Logout
    FROM table_name
    GROUP BY DATE(DateTime)
) AS temp;

SEE FIDDLE: 在日期上使用MAX()聚合是一种模拟表上的数据透视表以将两行(登录和注销)转换为两列的方法。希望有所帮助! :)

修改  您的数据与预期结果不符...即 登录2014-07-10 12:50:00和LOGOUT 2014-07-10 17:40:00 ..第10次注销时间不是你发布的预期结果...但是这个查询完成你想要的。