簡體   English   中英

在SQL Server中與Group by的總和和內部聯接

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

請幫助我獲得預期的輸出。 我有2張桌子

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,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

SQL小提琴演示

使用開窗功能的另一種方法:

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

演示版

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM