我正在使用内部联接,我希望将2个结果组合在一起显示在singel表中 我已创建查询以检查延迟和提前退出现在我希望两个输出显示为一个singel表 查询lateComing:
select k.EmpId,Min(k.DateofCheckin) as mindate,
case
when min(time(DateofCheckin))<=@i then 'Ontime'
when min(time(DateofCheckin)) between @i and @j then 'Late'
when min(time(DateofCheckin)) between @j and @n then 'HalfDay'
when DAYOFWEEK(Date(DateofCheckin)) =7 and min(time(DateofCheckin)) >@j then 'HalfDay'
else 'Absent' end as LoginStatus
from CheckInLogs k Join
(select
@i:=time(r.LateComer) as LateComing,
@j:=time(r.LateComingEndTime) as LateComingEnd,
@m:=time(LunchStartTime),
@n:=time(LunchEndTime),
@o:=time(EarlyLeavingStartTime),
@p:=time(EarlyLeavingEndTime),
e.EmpId
FROM Employees e JOIN Profiles r ON e.LeaveProfile=r.ProfileName) h
on k.EmpId=h.EmpId
where k.DateofCheckin='in' and
DAYOFWEEK(Date(k.DateofCheckin)) != 1 and
k.BranchId=1 and date(DateofCheckin) between '2013-05-1' and '2013-05-29'
group BY date(k.DateofCheckin),k.EmpId
查询EarlyLeaving:
select
EmpId,Date(DateofCheckin) as LogoutDate,DateofCheckin,max(time(DateofCheckin)) as LogoutTime,
case
when max(time(DateofCheckin))>=@p then 'Ontime'
when DAYOFWEEK(Date(DateofCheckin)) =7 and max(time(DateofCheckin)) < @m
then 'HalfDay'
when DAYOFWEEK(Date(DateofCheckin)) =7 and max(time(DateofCheckin)) > @m then 'Ontime'
when max(time(DateofCheckin)) between @o and @p then 'EarlyLeaving'
when max(time(DateofCheckin)) between @m and @o then 'HalfDay'
when max(time(DateofCheckin))<=@m then 'Absent'
else 'Absent' end as LogoutStatus
from CheckInLogs k1 Join
(select
@i:=time(r.LateComingStartTime) as LateComing,
@j:=time(r.LateComingEndTime) as LateComingEnd,
@m:=time(LunchStartTime),
@n:=time(LunchEndTime),
@o:=time(EarlyLeavingStartTime),
@p:=time(EarlyLeavingEndTime),
e.EmpId
FROM Employees e JOIN Profiles r ON e.LeaveProfile=r.ProfileName) h1
on k1.EmpId=h1.EmpId
where k1.DateofCheckin='Out'
and k1.BranchId=1
and DAYOFWEEK(Date(k1.DateofCheckin)) != 1 and
date(k1.DateofCheckin) between '2013-06-1' and '2013-06-29'
group BY date(k1.DateofCheckin),k1.EmpId
答案 0 :(得分:1)
以下是我如何处理查询的示例,这是一个快速复制和过去的工作,因此您必须修复语法错误等。主要区别在于您只需要在查询开始时获取一次员工详细信息,并在两个当前查询(员工除外)之间添加公共字段以加入。在这种情况下,我使用了logoutdate
select *
from (select
@i:=time(r.LateComer) as LateComing,
@j:=time(r.LateComingEndTime) as LateComingEnd,
@m:=time(LunchStartTime),
@n:=time(LunchEndTime),
@o:=time(EarlyLeavingStartTime),
@p:=time(EarlyLeavingEndTime),
e.EmpId
FROM Employees e JOIN Profiles r ON e.LeaveProfile=r.ProfileName) h
JOIN (select
EmpId, Date(DateofCheckin) as LogoutDate,
DateofCheckin,max(time(DateofCheckin)) as LogoutTime,
case
when max(time(DateofCheckin))>=@p then 'Ontime'
when DAYOFWEEK(Date(DateofCheckin)) =7 and max(time(DateofCheckin)) < @m
then 'HalfDay'
when DAYOFWEEK(Date(DateofCheckin)) =7 and max(time(DateofCheckin)) > @m then 'Ontime'
when max(time(DateofCheckin)) between @o and @p then 'EarlyLeaving'
when max(time(DateofCheckin)) between @m and @o then 'HalfDay'
when max(time(DateofCheckin))<=@m then 'Absent'
else 'Absent' end as LogoutStatus
from CheckInLogs k1
where k1.DateofCheckin='Out'
and k1.BranchId=1
and DAYOFWEEK(Date(k1.DateofCheckin)) != 1
group BY date(k1.DateofCheckin), k1.EmpId) out
ON out.empid = h.empid
JOIN (select k.EmpId, Date(DateofCheckin) as LogoutDate,
Min(k.DateofCheckin) as mindate,
case
when min(time(DateofCheckin))<=@i then 'Ontime'
when min(time(DateofCheckin)) between @i and @j then 'Late'
when min(time(DateofCheckin)) between @j and @n then 'HalfDay'
when DAYOFWEEK(Date(DateofCheckin)) =7
and min(time(DateofCheckin)) >@j then 'HalfDay'
else 'Absent' end as LoginStatus
from CheckInLogs k Join
where k.DateofCheckin='in' and
DAYOFWEEK(Date(k.DateofCheckin)) != 1 and
group BY date(k.DateofCheckin),k.EmpId) in
ON in.empid = out.empid
AND in.LogoutDate = out.LogoutDate
我还会考虑将case
和group bys
移到顶级查询。