简体   繁体   English

在SQL Server中与Group by的总和和内部联接

[英]Sum and Inner Join with Group by in Sql Server

Please help me to get a expected output. 请帮助我获得预期的输出。 I have 2 tables 我有2张桌子

1.LeaveEntries 1.离开条目

     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 2,2014年员工假期

      emp_id   leaveTypesName      allowedLeaves
     -------------------------------------------
         1          CL                  12
         1          SL                  6
         1          FH                  5
         1          EL                  12
         1          PL                  6

And this is my Query 这是我的查询

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

Expected Output: 预期产量:

     LeaveTypeSName  allowedLeaves      leaveTaken
     -------------------------------------------
         CL             12                  6.5
         SL             6                   1.5
         FH             5                   0
         EL             12                  0
         PL             6                   0

Please try: 请试试:

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 SQL小提琴演示

Another approach using windowing functions: 使用开窗功能的另一种方法:

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 演示版

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM