需要以下说明中定义的方案的专家意见

问题描述

SELECT
VP.PERSONNUM,VP.PAYCODENAME,VP.PAYCODEID,VP.TIMEINSECONDS,TI.ENTEREDONDTM,VP.APPLYDATE,VP.LABORLEVELNAME2,VP.LABORLEVELNAME4,VP.LABORLEVELNAME5,[enter image description here][1]
CONVERT(VARCHAR(10),VP.ADJUSTEDAPPLYDATE,23) ORIGINALDATE,CONVERT(VARCHAR(10),VP.PREVPAYPERIODSTART,23)PREVPAYPERIODSTAR,VP.PREVPAYPERIODEND,112)PREVPAYPERIODEND

FROM VP_TOTALS VP
JOIN TIMESHEETITEM TI
ON TI.EMPLOYEEID = VP.EMPLOYEEID AND TI.TIMESHEETITEMID = VP.TIMESHEETITEMID and TI.DELETEDSW <> '1' 
WHERE VP.PAYCODETYPE <> 'G' 
and VP.PERSONNUM='100419'
and vp.PAYCODEID in ('145','701')
AND APPLYDATE BETWEEN '2020-06-01' AND '2020-06-30'
Order by VP.PERSONNUM,VP.APPLYDATE 

有2个支付代码Overtime(SWG)Regular(SWG)根据日期分别排在各个行中 示例-第一行人员人数= 100149,申请日期= 6/3/2020,支付代码= Overtime(SWG),Timeinseconds = 1800
第二行人员数字为100149,适用日期= 6/3/2020,支付代码常规(SWG),秒数= 1500。 2)我的主要要求是这两行应加在一起,并且通过加在一起仅显示1行。 即人员编号= 100149,应聘日期= 6/3/2020,付款代码= [加班(SWG)+常规(SWG)],秒= 2300] 1

解决方法

很难确定WHERE条件下的所有情况。根据笔记中的描述,我在想这样的事情。

[编辑]将PAYCODEID串联添加到GROUP BY子句

;with
overtime_cte as (select * from VP_TOTALS where PAYCODEID='Overtime(SWG)' and VP.PERSONNUM='100419'),regular_cte as (select * from VP_TOTALS where PAYCODEID='Regular(SWG)' and VP.PERSONNUM='100419')
select rc.PERSONNUM,rc.APPLYDATE,concat(rc.PAYCODEID,'+',oc.PAYCODEID) PAYCODEID,sum(rc.TIMEINSECONDS+oc.TIMEINSECONDS)
from regular_cte rc
     join
     overtime_cte oc on rc.PERSONNUM=oc.PERSONNUM
                        and rc.APPLYDATE=oc.APPLYDATE
group by rc.PERSONNUM,oc.PAYCODEID);