Sql Server中的Sum和Inner Join with Group by

时间:2014-07-30 05:48:25

标签: sql sql-server-2008

请帮助我获得预期的输出。  我有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

2 个答案:

答案 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

SQL Fiddle Demo

答案 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

Demo