Sql 将两个连续的行合并到一列中

Sql 将两个连续的行合并到一列中,sql,sql-server,tsql,Sql,Sql Server,Tsql,假设我有一张这样的桌子: 员工代码 入口类型 时间 ABC200413 在里面 上午8:48 ABC200413 出来 下午4:09 ABC200413 在里面 下午4:45 ABC200413 出来 下午6:09 ABC200413 在里面 下午7:45 ABC200413 出来 晚上10:09 提供的mytable仅包含有效的输入/输出事件对 select EmployeeCode, max(case EntryType when 'IN' then TIME end ) IN_TIM

假设我有一张这样的桌子:

员工代码 入口类型 时间 ABC200413 在里面 上午8:48 ABC200413 出来 下午4:09 ABC200413 在里面 下午4:45 ABC200413 出来 下午6:09 ABC200413 在里面 下午7:45 ABC200413 出来 晚上10:09 提供的mytable仅包含有效的输入/输出事件对

select EmployeeCode, 
  max(case EntryType when 'IN' then TIME end ) IN_TIME,
  max(case EntryType when 'OUT' then TIME end ) OUT_TIME
from ( 
   select EmployeeCode, EntryType, TIME,
     row_number() over(partition by EmployeeCode, EntryType order by TIME) rn
   from mytable
   )t
group by EmployeeCode, rn
order by EmployeeCode, rn

否则,首先需要进行一种清理。

一种可能有效的解决方案是使用内部联接。。因为您可能有多个输入和输出记录

Select A.EmployeeCode,
       Min(TIME) IN_TIME,
       (Select Max(A2.TIME) From Attendance A2 Where A2.EmployeeCode = A.EmployeeCode And A2.EntryType = 'OUT') OUT_TIME
From Attendance  A
Where A.EntryType = 'IN'
Group By A.EmployeeCode

因此,主查询获取每个员工的最大外出时间&内部查询获取最小及时时间。该解决方案假设至少每个员工都有一个IN-record

假设总是有成对的IN/OUT,您可以使用LEAD来获取下一个值

选择 雇员守则, 时间就像你的时间一样, 下一次作为外出时间 从…起 选择*, leadcase EntryType在“OUT”时,然后在下一时刻按员工代码顺序结束分区 从mytable T 其中EntryType='IN';
根据问题指南,请说明您尝试了什么,并告诉我们您在本网站或其他网站上找到了什么,以及为什么它不能满足您的需要。您可以参考此链接,假设表中的行具有自然顺序。你打算如何确保这一点?Koushik Roy发布的链接没有回答这个问题,因为我们这里的海报上每个客户可以有任意数量的输入和输出。提供的答案假设三行数不变。@MarkRoberts我们是从代码级别管理的,因此此表中的所有内容都将采用此模式。非常感谢,它很有效:很好的一个Serg!!!