抱歉误导性的问题,但我不知道如何命名我的问题。
我的 db<>fidle 在这里。
我有一个定义如下的表:
CREATE TABLE shift (
worker_name VARCHAR(25),
log_time DATETIME,
in_out VARCHAR(3)
);
Run Code Online (Sandbox Code Playgroud)
它包含以下数据:
INSERT INTO shift VALUES ('User 1', '2018-05-14 07:24:40.000', 'IN');
INSERT INTO shift VALUES ('User 2', '2018-05-14 11:55:29.000', 'IN');
INSERT INTO shift VALUES ('User 3', '2018-05-14 14:03:26.000', 'IN');
INSERT INTO shift VALUES ('User 1', '2018-05-14 14:05:08.000', 'Out');
INSERT INTO shift VALUES ('User 3', '2018-05-14 20:08:30.000', 'Out');
INSERT INTO shift VALUES ('User 2', '2018-05-14 20:08:36.000', 'Out');
INSERT INTO shift VALUES ('User 4', '2018-05-14 20:09:14.000', 'Out');
Run Code Online (Sandbox Code Playgroud)
因此,我想得到:
worker_name | IN | OUT
:---------- | :------------------ | :------------------
User 1 | 14/05/2018 07:24:40 | 14/05/2018 14:05:08
User 2 | 14/05/2018 11:55:29 | 14/05/2018 20:08:36
User 3 | 14/05/2018 14:03:26 | 14/05/2018 20:08:30
User 4 | ---------- | 14/05/2018 20:09:14
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
这是一个旋转的例子:
select worker_name, max(_in) as _in, max(_out) as _out
from (
select worker_name
, case when in_out = 'IN' then log_time end as _in
, case when in_out = 'OUT' then log_time end as _out
from shift
) as t
group by worker_name;
Run Code Online (Sandbox Code Playgroud)
这个想法是映射log_time
到_in
when in_out = 'IN'
,同理 for _out
。在外部select
使用聚合函数过滤空值。首先尝试运行内部select
以了解正在发生的事情。
一般来说,数据的呈现最好由应用层处理。所以我建议按原样阅读表格,让应用程序处理数据的呈现。
归档时间: |
|
查看次数: |
26300 次 |
最近记录: |