27,579
社区成员
发帖
与我相关
我的任务
分享
--创建表
if object_id('tempdb..#a','U') is not null
drop table #a ;
go
create table #a
(
workID char(3),
Date1 DATE,
time1 time(0),
WorkType tinyint,
WorkState char(4)
)
--插入数据
insert into #a (WorkID,Date1,Time1,WorkType,WorkState)
values ('001','2014-05-06','08:30',1,'正常'),
('001','2014-05-06','17:36',2,'正常');
--语句
select a.workid as [工号],a.date1 as [日期],a.time1 as [上班打卡时间],b.time1[下班打卡时间],a.workstate as [状态]
from #a as a inner join #a as b on a.workID = b.workID and a.date1 = b.date1 and a.Worktype = b.worktype+1 and b.workState ='正常'
where a.workState = '正常'
--结果展示
/*
工号 日期 上班打卡时间 下班打卡时间 状态
---- ---------- ---------------- ---------------- ----
001 2014-05-06 17:36:00 08:30:00 正常
(1 行受影响)
*/
--> 测试数据: [ta]
if object_id('[ta]') is not null drop table [ta]
go
create table [ta] ([工号] varchar(3),[日期] datetime,[打卡时间] varchar(10),[打卡类型] varchar(4),[状态] sql_variant)
insert into [ta]
select '001','2014-05-06', '08:30',1,'正常' union all
select '001','2014-05-06', '17:36',2,'正常'
select 工号,日期,上班打卡时间=max(case when 打卡类型=1 then 打卡时间 end),
下班打卡时间=max(case when 打卡类型=2 then 打卡时间 end)
from ta t
group by 工号,日期
001 2014-05-06 00:00:00.000 08:30 17:36
--> 测试数据: [ta]
if object_id('[ta]') is not null drop table [ta]
go
create table [ta] ([工号] varchar(3),[日期] datetime,[打卡时间] varchar(10),[打卡类型] varchar(4),[状态] NVARCHAR(10))
insert into [ta]
select '001','2014-05-06', '08:30',1,N'正常' union all
select '001','2014-05-06', '17:36',2,N'正常' UNION ALL
select '002','2014-05-06', '08:50',1,N'正常' union all
select '002','2014-05-06', '17:36',2,N'正常'
SELECT *,CASE WHEN 上班打卡时间>'08:30' AND 下班打卡时间>='17:30' THEN N'迟到' ELSE N'正常' END [状态]
FROM (
SELECT 工号 ,
日期 ,
上班打卡时间 = MAX(CASE WHEN 打卡类型 = 1 THEN 打卡时间
END) ,
下班打卡时间 = MAX(CASE WHEN 打卡类型 = 2 THEN 打卡时间
END)
FROM ta t
GROUP BY 工号 ,
日期 )a
/*
工号 日期 上班打卡时间 下班打卡时间 状态
---- ----------------------- ---------- ---------- ----
001 2014-05-06 00:00:00.000 08:30 17:36 正常
002 2014-05-06 00:00:00.000 08:50 17:36 迟到
*/