简体   繁体   中英

How to sum of 2 rows based on condition in SQL Server 2008

How to merge two rows to single row with sum?

This is what am getting now...

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

but my expected output is

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

This is my SQL query

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

this is my LeaveEntries Table

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 

I haven't tried this,

the idea is just to take your current result as it is, just remove ' P- ' from LeaveTypeFName & then again group by result. Hope this work!

;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

Use Case Statement to do this.

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 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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