Hi sgmunson,
Sorry for the late reply as I have been traveling and finally came back home to work on this again.
So an excellent question and the answer is that the hours belongs to out punch day based on their pay policies however now they don't care about this rule any longer so the first question is out the door 🙂
The second question was that is there a way to add a counter at the end of each row which is based on SHIFT_LABEL OR ABSENT_PAY PAYCODE (only when the PAYODDE is in Leave1 and Leave 2 on the same day) so in case if there were two shifts in a day OR PAYCODES of Leave1 and Leave2 on the same day then the last newly added COUNTER column could be a '1' for first shift and a '2' for row of 2nd shift OR a '1 for the Leave1 and a '2 for the Leave2?
Thank you,
Please see example below.
Thank you everyone,
WITH SampleData (PERSON,TRANSACTDATE, STARTDATE, END_DATE, IN_PUNCH,OUT_PUNCH,HOURS,PAYCODE,SHIFT_LABEL,DOW) AS
(
SELECT 1234,'07/27/2015','07/27/2015','07/27/2015', '12:00','12:00','8', 'Hol', 'NULL', 'Monday' UNION ALL
SELECT 1234,'07/28/2015','07/28/2015','07/28/2015', '08:00','','4.00', 'Absent', 'Batax 1st','Tuesday' UNION ALL
SELECT 1234,'07/28/2015','07/28/2015','07/28/2015', '12:15','14:00','3.75', 'Regular', 'Batax 1st','Tuesday' UNION ALL
SELECT 1234,'07/29/2015','07/29/2015','07/29/2015', '06:00','10:00','4', 'Regular', 'Batax 1st','Wednesday' UNION ALL
SELECT 1234,'07/29/2015','07/29/2015','07/29/2015', '11:00','13:00','2', 'Regular', 'Batax 2nd','Wednesday' UNION ALL
SELECT 1234,'07/30/2015','07/30/2015','07/30/2015', '08:00','14:00','6', 'Regular', 'Batax 1st','Thursday' UNION ALL
SELECT 1234,'07/31/2015','07/31/2015','07/31/2015', '08:00','12:00','4', 'Leave1', 'Batax 1st','Friday' UNION ALL
SELECT 1234,'07/31/2015','07/31/2015','07/31/2015', '13:00','17:00','4', 'Leave2', 'Batax 1st','Friday'
)
, cte2 AS (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY SampleData.PERSON, SampleData.TRANSACTDATE, SampleData.SHIFT_LABEL
ORDER BY SampleData.IN_PUNCH) AS RN,
MAX(CASE WHEN PAYCODE IN ('Regular', 'Hol-Wrkd') THEN PAYCODE ELSE NULL END) OVER (PARTITION BY SampleData.PERSON, SampleData.TRANSACTDATE, SampleData.SHIFT_LABEL) AS WORK_PAY,
SUM(CASE WHEN PAYCODE IN ('Regular', 'Hol-Wrkd') THEN CONVERT(DECIMAL(4,2), HOURS) ELSE 0.00 END) OVER (PARTITION BY SampleData.PERSON, SampleData.TRANSACTDATE, SampleData.SHIFT_LABEL) AS WORK_HRS,
MAX(CASE WHEN PAYCODE IN ('Day-OT') THEN PAYCODE ELSE NULL END) OVER (PARTITION BY SampleData.PERSON, SampleData.TRANSACTDATE, SampleData.SHIFT_LABEL) AS OT_PAY,
SUM(CASE WHEN PAYCODE IN ('Day-OT') THEN CONVERT(DECIMAL(4,2), HOURS) ELSE 0.00 END) OVER (PARTITION BY SampleData.PERSON, SampleData.TRANSACTDATE, SampleData.SHIFT_LABEL) AS OT_HRS,
MAX(CASE WHEN PAYCODE IN ('Hol', 'Absent', 'EO', 'Personal','Leave1','Leave2') THEN PAYCODE ELSE NULL END) OVER (PARTITION BY SampleData.PERSON, SampleData.TRANSACTDATE, SampleData.SHIFT_LABEL) AS ABSNT_PAY,
SUM(CASE WHEN PAYCODE IN ('Hol', 'Absent', 'EO', 'Personal','Leave1','Leave2') THEN CONVERT(DECIMAL(4,2), HOURS) ELSE 0.00 END) OVER (PARTITION BY SampleData.PERSON, SampleData.TRANSACTDATE, SampleData.SHIFT_LABEL) AS ABSNT_HRS
FROM SampleData
)
SELECT PERSON, TRANSACTDATE, STARTDATE, END_DATE,
-- apply new rule for blanking out these columns
CASE WHEN ABSNT_HRS > 0 AND WORK_HRS + OT_HRS = 0 THEN '' ELSE IN_PUNCH END AS IN_PUNCH,
CASE WHEN ABSNT_HRS > 0 AND WORK_HRS + OT_HRS = 0 THEN '' ELSE OUT_PUNCH END AS OUT_PUNCH,
WORK_PAY, WORK_HRS,
OT_PAY, OT_HRS,
ABSNT_PAY, ABSNT_HRS,
SHIFT_LABEL, DOW
FROM cte2 t1
CROSS APPLY (SELECT MAX(RN) FROM cte2 t2 WHERE t1.PERSON = t2.PERSON AND t1.TRANSACTDATE = t2.TRANSACTDATE) ca(MaxRN)
WHERE RN = CASE WHEN ABSNT_HRS > 0 AND WORK_HRS + OT_HRS > 0 THEN ca.MaxRN ELSE 1 END
ORDER BY PERSON DESC, TRANSACTDATE, IN_PUNCH;
The results from the above are as follows:
PERSONTRANSACTDATESTARTDATEEND_DATEIN_PUNCHOUT_PUNCHWORK_PAYWORK_HRSOT_PAYOT_HRSABSNT_PAYABSNT_HRSSHIFT_LABELDOW
123407/27/201507/27/201507/27/2015 NULL 0.00 NULL0.00Hol 8.00 NULL Monday
123407/28/201507/28/201507/28/201512:15 14:00 Regular 3.75 NULL0.00Absent 4.00 Batax 1stTuesday
123407/29/201507/29/201507/29/201506:00 10:00 Regular 4.00 NULL0.00NULL 0.00 Batax 1stWednesday
123407/29/201507/29/201507/29/201511:00 13:00 Regular 2.00 NULL0.00NULL 0.00 Batax 2ndWednesday
123407/30/201507/30/201507/30/201508:00 14:00 Regular 6.00 NULL0.00NULL 0.00 Batax 2ndThursday
123407/31/201507/31/201507/31/2015 NULL 0.00 NULL0.00Leave2 8.00 Batax 1stFriday
New desired results:
PERSONTRANSACTDATESTARTDATEEND_DATEIN_PUNCHOUT_PUNCHWORK_PAYWORK_HRSOT_PAYOT_HRSABSNT_PAYABSNT_HRSSHIFT_LABELDOW COUNTER
123407/27/201507/27/201507/27/2015 NULL 0.00 NULL0.00Hol 8.00 NULL Monday 1
123407/28/201507/28/201507/28/201512:15 14:00 Regular 3.75 NULL0.00Absent 4.00 Batax 1stTuesday 1
123407/29/201507/29/201507/29/201506:00 10:00 Regular 4.00 NULL0.00NULL 0.00 Batax 1stWednesday 1
123407/29/201507/29/201507/29/201511:00 13:00 Regular 2.00 NULL0.00NULL 0.00 Batax 2nd Wednesday 2
123407/30/201507/30/201507/30/201508:00 14:00 Regular 6.00 NULL0.00NULL 0.00 Batax 1stThursday 1
123407/31/201507/31/201507/31/201508:00 12:00 NULL 0.00 NULL0.00Leave1 4.00 Batax 1stFriday 1
123407/31/201507/31/201507/31/201513:00 17:00 NULL 0.00 NULL0.00Leave2 4.00 Batax 1stFriday 2