SQL Server:将一列的结果合并,然后分成两列

时间:2019-12-06 14:56:05

标签: sql sql-server

由于该社区的一些用户已经回答了我的问题,所以我想问另一个具有不同标准的人。这是我问Previous question的最后一个问题,我想加以改善。

表格:persona

Name                    date        time                InOut
--------------------------------------------------------------
MANCA GIOVANNI          2019-12-06  10:50:00.0000000    I
MANCA GIOVANNI          2019-12-06  10:52:00.0000000    I
MANCA GIOVANNI          2019-12-06  10:55:00.0000000    I
MANCA GIOVANNI          2019-12-06  12:55:00.0000000    O
MANCA GIOVANNI          2019-12-06  12:57:00.0000000    O
HAMPIT RICKY            2019-12-06  12:55:00.0000000    O
HAMPIT RICKY            2019-12-06  10:50:00.0000000    I
RODRIGUEZ CARLOS DANIEL 2019-12-06  10:50:00.0000000    I
RODRIGUEZ CARLOS DANIEL 2019-12-06  12:55:00.0000000    O

基于该表,我希望得到如下输出

Name                    date        InTime              OutTime
--------------------------------------------------------------
MANCA GIOVANNI          2019-12-06  10:50:00.0000000    12:55:00.0000000
MANCA GIOVANNI          2019-12-06  10:52:00.0000000    12:57:00.0000000
MANCA GIOVANNI          2019-12-06  10:55:00.0000000    ? (I don't know how to handle it, maybe someone can help me think it out)
HAMPIT RICKY            2019-12-06  10:50:00.0000000    12:55:00.0000000
RODRIGUEZ CARLOS DANIEL 2019-12-06  10:50:00.0000000    12:55:00.0000000

这是我用来使其正常运行的最佳答案,但由于它一次只能显示一个人,因此它是有限的

SELECT 
    Name, date,
    MAX(CASE WHEN InOut = 'I' THEN time END) AS Intime,
    MAX(CASE WHEN InOut = 'O' THEN time END) AS Outime
FROM 
    persona 
GROUP BY
    Name, date

谢谢

1 个答案:

答案 0 :(得分:2)

您可以使用row_number()

select Name, date,
       max(CASE WHEN InOut = 'I' THEN time END) AS Intime,
       max(CASE WHEN InOut = 'O' THEN time END) AS Outime
from (select p.*,
             row_number() over (partition by name, date, inout order by time) as seqnum
      from persona p
     ) p
group by name, date, seqnum
相关问题