表結構如下
工號,日期,  時間上下班狀態(0表示上班,1表示下班)B0905 2010802 0627    0
B0905 2010802 0727    0
B0905 2010802 1727    1
B0905 2010802 1927    1我需要這個人上班的第一筆,和下班的最後一筆如下
B0905 2010802 0627    1927 

解决方案 »

  1.   

    if not object_id('tb') is null
    drop table tb
    Go
    Create table tb([工號] nvarchar(5),[日期] int,[時間] nvarchar(4),[上下班狀態] int)
    Insert tb
    select N'B0905',2010802,N'0627',0 union all
    select N'B0905',2010802,N'0727',0 union all
    select N'B0905',2010802,N'1727',1 union all
    select N'B0905',2010802,N'1927',1
    Go
    Select [工號],
           [日期],
           min(case when [上下班狀態]=0 then [時間] else null end),
           max(case when [上下班狀態]=1 then [時間] else null end) 
    from tb
    group by [工號],[日期]
    /*
    工號    日期               
    ----- ----------- ---- ----
    B0905 2010802     0627 1927
    警告: 彙總或其他 SET 作業已刪除 Null 值。(1 個資料列受到影響)
    */ 
      

  2.   


    select 工號,日期,max(時間) 時間 ,上下班狀態
    from table
    where 上下班狀態=0
    group by 工號,日期
    union all
    select 工號,日期,min(時間) 時間 ,上下班狀態
    from table
    where 上下班狀態=1
    group by 工號,日期;
      

  3.   

    declare @a TABLE(a VARCHAR(20),b VARCHAR(20),c VARCHAR(20),d BIT)
    insert @a select 'B0905', '2010802', '0627', 0
    union all select 'B0905', '2010802', '0727', 0
    union all select 'B0905', '2010802', '1727', 1
    union all select 'B0905', '2010802', '1927', 1
    SELECT a,b, MIN(CASE WHEN d=0 THEN c ELSE '9999' END),
    MAX(CASE WHEN d=1 THEN c ELSE '0000' END)
    FROM @a 
    GROUP BY a,b--result
    /*a                    b                                                              
    -------------------- -------------------- -------------------- -------------------- 
    B0905                2010802              0627                 1927(所影响的行数为 1 行)*/
      

  4.   


    select a.工號,a.日期,min(a.時間),max(b.時間)
    from tablename a,tablename b
    where a.工號=b.工號 and a.上下班狀態=0 and b.上下班狀態=1
    group by  a.工號,a.日期