2013-02-21 60 views
-1

我有这样的n行到n/2 colums:sqlserver的

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 
+2

看起来像是使用字符串/文本/ varchar列来处理时态数据。这是一个坏主意。 – 2013-02-21 14:02:36

+0

这是否意味着格式化输出..? – SenthilPrabhu 2013-02-21 14:05:22

回答

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

然而,在某些情况下,这可能是片状的。缺少数据,多天等等。只有当你查看你的实时数据时你才能确定。另外,如前所述,设计中可能存在更多的基本问题,例如将时间与不需要的日期分开存储。如果你有一个标志表示哪一行是进/出,那也会更容易。