n行到n / 2列:Sql Server

时间:2013-02-21 14:01:34

标签: sql-server sql-server-2008

我有这样的表

insert into attn (StaffNo, ADate, ATime) values ('12345',   '12-02-2013',   09.10)
insert into attn (StaffNo, ADate, ATime) values ('12345',   '12-02-2013',   10.03)
insert into attn (StaffNo, ADate, ATime) values ('12345',    '12-02-2013',   10.40)
insert into attn (StaffNo, ADate, ATime) values ('12345',   '12-02-2013',   17.30)

我想要这种格式

输出:

     StaffNo        ADate       InTime     OutTime
      12333,      12-02-2013     09.10      10.03
      12333,      12-02-2013     10.40      17.30

1 个答案:

答案 0 :(得分:1)

这样的内容适用于您的示例行:

with attnJoin as
(
  select attn.StaffNo
  , attn.ADate
  , InTime = attn.ATime
  , OutTime = prev.ATime
  , eventNumber = row_number() over (partition by attn.StaffNo, attn.ADate order by attn.ATime)
  from attn
  outer apply
  (
    select top 1 ATime
    from attn prev
    where attn.StaffNo = prev.StaffNo
    and attn.ADate = prev.ADate
    and attn.Atime < prev.ATime
    order by ATime
  ) prev
)
select StaffNo
  , ADate
  , InTime
  , OutTime
from attnJoin
where eventNumber % 2 = 1

SQL Fiddle with demo

然而,在某些情况下这可能是不稳定的,例如:缺少数据,多天等。只有您在查看实时数据时才能确定。

另外,正如已经指出的那样,设计可能存在更多基本问题,例如与不需要的日期分开存储时间。如果你有一个标志指示哪一行进/出,那也会更容易。