如何将行转换为 SQL 中的列?

ger*_*ick 5 sql-server t-sql

抱歉误导性的问题,但我不知道如何命名我的问题。

我的 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)

我怎样才能做到这一点?

Len*_*art 6

这是一个旋转的例子:

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_inwhen in_out = 'IN',同理 for _out。在外部select使用聚合函数过滤空值。首先尝试运行内部select以了解正在发生的事情。

一般来说,数据的呈现最好由应用层处理。所以我建议按原样阅读表格,让应用程序处理数据的呈现。