如何根据SQL Server 2008中的条件求和2行

时间:2015-01-06 11:37:42

标签: sql sql-server database

如何使用sum将两行合并为单行?

这就是我现在要做的......

LeaveTypeId   LeaveTypeFName       day
---------------------------------------
 1            Casual Leave         9.0
 3            SickLeave            3.0
10            Festival             4.0
11            LOP                 15.0
14            National Holiday     4.0
18            P-SickLeave          1.0
19            P-Casual Leave       3.0

但我的预期输出是

LeaveTypeId   LeaveTypeFName           day
--------------------------------------------
 1            Casual Leave(All)        12.0
 3            SickLeave(All)            4.0
10            Festival                  4.0
11            LOP                      15.0
14            National Holiday          4.0

这是我的SQL查询

select  
   b.LeaveTypeId,LeaveTypeFName,
   SUM(case when LeaveStatus = 'FullDay' 
               then DATEDIFF(day, FromDate, ToDate) + 1 
               else 0.5 
       end) as 'day'
from 
   LeaveEntries a
join 
   LeaveTypes b on a.LeaveTypeId = b.LeaveTypeId
where 
   EmployeeId = '3862'
group by 
   LeaveTypeFName, b.LeaveTypeId

这是我的LeaveEntries表

LeaveEntryId    LeaveTypeId LeaveStatus EmployeeId  FromDate         ToDate         
  19              3            FullDay     3484     2013-02-06      2013-02-09  
  21              1            HalfDay     3484     2013-03-07      2013-03-07 

2 个答案:

答案 0 :(得分:1)

我没试过这个,

这个想法只是将您当前的结果保持原样,只需从P-&中删除“LeaveTypeFName”即可。然后再按结果分组。希望这项工作!

;With CTE as
(
    select  
       b.LeaveTypeId
      ,Case When b.LeaveTypeId in(18,19) 
              Then Replace(LeaveTypeFName,'P-','') 
              Else LeaveTypeFName 
       End as LeaveTypeFName
      ,SUM(case when LeaveStatus = 'FullDay' 
              Then DATEDIFF(day, FromDate, ToDate) + 1 
              Else 0.5 
            end) as 'day'
    from LeaveEntries a
    join LeaveTypes b on a.LeaveTypeId = b.LeaveTypeId
    where EmployeeId = '3862'
    group by LeaveTypeFName, b.LeaveTypeId
)
Select max(LeaveTypeId) as LeaveTypeId
        ,LeaveTypeFName
        ,Sum(day)
     from CTE
group by LeaveTypeFName

答案 1 :(得分:0)

使用Case Statement执行此操作。

SELECT CASE
         WHEN LeaveTypeFName LIKE '%Casual Leave%' THEN 'Casual Leave(All)'
         WHEN LeaveTypeFName LIKE '%SickLeave%' THEN 'SickLeave (All)'
         WHEN LeaveTypeFName LIKE '%Festival%' THEN 'Festival'
         WHEN LeaveTypeFName LIKE '%LOP%' THEN 'LOP'
         WHEN LeaveTypeFName LIKE '%National Holiday%' THEN 'National Holiday'
       END LeaveTypeFName,
       Sum([day]) [day]
FROM   result
GROUP  BY CASE
            WHEN LeaveTypeFName LIKE '%Casual Leave%' THEN 'Casual Leave(All)'
            WHEN LeaveTypeFName LIKE '%SickLeave%' THEN 'SickLeave (All)'
            WHEN LeaveTypeFName LIKE '%Festival%' THEN 'Festival'
            WHEN LeaveTypeFName LIKE '%LOP%' THEN 'LOP'
            WHEN LeaveTypeFName LIKE '%National Holiday%' THEN 'National Holiday'
          END