Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Server中与Group by的Sum和内部联接_Sql_Sql Server 2008 - Fatal编程技术网

Sql Server中与Group by的Sum和内部联接

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/

请帮助我获得预期的输出。 我有两张桌子

1.1.2参赛作品

     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吗?