Sql Server中与Group by的Sum和内部联接
请帮助我获得预期的输出。 我有两张桌子 1.1.2参赛作品Sql Server中与Group by的Sum和内部联接,sql,sql-server-2008,Sql,Sql Server 2008,请帮助我获得预期的输出。 我有两张桌子 1.1.2参赛作品 emp_id LeaveTypeSName LeaveStatus FromDate ToDate ---------------------------------------------------------------------- 1 CL Full Day 21/07/2014 21/
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.员工休假2014
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
请尝试:
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
请尝试:
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
另一种使用窗口功能的方法:
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
另一种使用窗口功能的方法:
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
@kristianp,这是一个完全可以接受的问题。OP展示了工作以及预期的输入和输出。你还想让他添加什么?完全正确@paqogomez+1。我认为评论所有者没有正确地看到整个问题。@kristianp,这是一个完全可以接受的问题。OP展示了工作以及预期的输入和输出。你还想让他添加什么?完全正确@paqogomez+1。我认为评论的所有者没有正确地看到整个问题。这里可能是正确的。。但是你有一个语法错误。我认为这是与插入有关的问题。。。请检查编辑的小提琴我想减去allowedleaves和leavestaken列我怎么能?我尝试了ISNULL(allowedleaves,0)-ISNULL(leavestaken,0),但它显示错误无效的列名“leavestaken”。@DileepKumar你需要它作为一个额外的列或代替leavestaken吗?可能在这里的正确轨道上。。但是你有一个语法错误。我认为这是与插入有关的问题。。。请检查编辑的小提琴我想减去allowedleaves和leavestaken列我怎么能??我尝试了ISNULL(allowedleaves,0)-ISNULL(leavestaken,0),但它显示错误无效的列名“leavestaken”。@DileepKumar您需要它作为额外的列或代替leavestaken吗?