表結構如下
工號,日期, 時間上下班狀態(0表示上班,1表示下班)B0905 2010802 0627 0
B0905 2010802 0727 0
B0905 2010802 1727 1
B0905 2010802 1927 1我需要這個人上班的第一筆,和下班的最後一筆如下
B0905 2010802 0627 1927
工號,日期, 時間上下班狀態(0表示上班,1表示下班)B0905 2010802 0627 0
B0905 2010802 0727 0
B0905 2010802 1727 1
B0905 2010802 1927 1我需要這個人上班的第一筆,和下班的最後一筆如下
B0905 2010802 0627 1927
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 個資料列受到影響)
*/
select 工號,日期,max(時間) 時間 ,上下班狀態
from table
where 上下班狀態=0
group by 工號,日期
union all
select 工號,日期,min(時間) 時間 ,上下班狀態
from table
where 上下班狀態=1
group by 工號,日期;
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 行)*/
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.日期