请帮助我获得预期的输出。 我有2张桌子
1.LeaveEntries
emp_id LeaveTypeSName LeaveStatus FromDate ToDate
----------------------------------------------------------------------
1 CL Full Day 21/07/2014 21/07/2014
1 SL Half Day 21/07/2014 21/07/2014
1 CL Full Day 21/07/2014 21/07/2014
1 SL Full Day 21/07/2014 21/07/2014
1 CL Half Day 21/07/2014 21/07/2014
1 CL Full Day 21/07/2014 24/07/2014
2.EmployeeLeaves2014
emp_id leaveTypesName allowedLeaves
-------------------------------------------
1 CL 12
1 SL 6
1 FH 5
1 EL 12
1 PL 6
这是我的查询
SELECT
c.LeaveTypeSName
,a.AllowedLeaves
,SUM(case when LeaveStatus='FullDay' then DATEDIFF(day, FromDate, ToDate)+1 else 0.5 end) AS 'leavetaken'
FROM EmployeeLeaves2014 a
INNER JOIN LeaveEntries b ON a.Emp_Id = b.Emp_Id
WHERE b.emp_id = '1'
GROUP BY LeaveTypeSName,AllowedLeaves
预期产出:
LeaveTypeSName allowedLeaves leaveTaken
-------------------------------------------
CL 12 6.5
SL 6 1.5
FH 5 0
EL 12 0
PL 6 0
答案 0 :(得分:3)
请尝试:
select
emp_id,
leaveTypesName,
allowedLeaves,
ISNULL((select SUM(datediff(d, FromDate, ToDate)+
(case when LeaveStatus='Half Day' then .5 else 1 end))
from LeaveEntries b where b.emp_id=a.emp_id and b.LeaveTypeSName=a.leaveTypesName), 0) as LeavesTaken
from EmployeeLeaves2014 a
答案 1 :(得分:1)
使用窗口函数的另一种方法:
select distinct
b.leavetypesname,
b.allowedleaves,
coalesce
(sum(datediff(day,fromdate,todate)
+ case
when leavestatus = 'Full Day' then 1
else 0.5
end) over (partition by a.leavetypesname order by a.emp_id)
,0) as leaveTaken
from leaveentries a
right join employeeleaves2014 b
on a.emp_id = b.emp_id
and a.leavetypesname = b.leavetypesname
order by leaveTaken desc