Code as follows...
DECLARE @Start datetime DECLARE @End datetime DECLARE @Movements table (MID int IDENTITY, Mproduct varchar(MAX), MPalletRef varchar(MAX), MLocation varchar(50), MAction varchar(MAX), MPickType varchar(50), MTimestamp datetime, MUsername varchar(50)) DECLARE @Shifts table (SID int IDENTITY, SUsername varchar(MAX), SDate date, SShift varchar(20), SShiftStart datetime, SShiftEnd datetime, SMovements int) DECLARE @ShiftData table (ID int IDENTITY, Product varchar(MAX), PalletRef varchar(50), Location varchar (50), Action varchar(MAX), PickType varchar(MAX), Timestamp datetime, Duration time, Consecutive int) DECLARE @CompiledData table (Username varchar(MAX), Site varchar(50), Date date, Shift varchar(50), Average varchar(10), Consecutive int, StandardRetrieval int, FreeRetrieval int, RDTRetrieval int, PutAway int, TotalTime varchar(10), RDTNonUsage decimal(6,1), TotalSeconds int, AverageSeconds int) DECLARE @Summary table (SUMUsername varchar(MAX), Site varchar(50), Shift varchar(50), ShiftsWorked int, Average varchar(10), Consecutive int, StandardRetrieval int, FreeRetrieval int, RDTRetrieval int, PutAway int, TotalTime varchar(10), RDTNonUsage decimal(6,1)) DECLARE @Date datetime DECLARE @Counter int DECLARE @ShiftRecord int SET @Start=@StartDate+'06:00' SET @End=DATEADD(DAY,1,@EndDate)+ '06:44:59:999' INSERT INTO @Movements (Mproduct, MPalletRef, MLocation, MAction, MPickType, MTimestamp, MUsername) (SELECT (SELECT Code + ' ' + Item FROM Products WHERE Product_id=(SELECT Product_id FROM Batch_Link WHERE Batch_id=Audit_Pallets.Batch_id))AS Product, PalletRef, (SELECT Location FROM Locations WHERE Location_id=Audit_Pallets.Location)AS Location, CASE WHEN Action='Pallet Relocated' THEN 'Put Away' ELSE 'Retrieve' END, CASE WHEN Action='Pallet Relocated' THEN 'Put Away' WHEN Action='Pallet Picked (RDT)' THEN 'Retrieve (RDT)' WHEN Action='Pallet Picked (SP)' THEN 'Retrieve (SP)' WHEN Action='Pallet Picked (FP)' THEN 'Retrieve (FP)' ELSE Action END, Timestamp, Username FROM Audit_Pallets WHERE Username IN (SELECT Name FROM ApplicationAuthentication.dbo.aspnet_Users WHERE Shift IS NOT NULL AND UserId IN (SELECT UserId FROM ApplicationAuthentication.dbo.aspnet_Membership WHERE IsApproved='1')) AND TimeStamp BETWEEN @Start AND @End) SET @Date=CONVERT(Date,@Start) WHILE @Date<=@End BEGIN INSERT INTO @Shifts (SUsername, SDate, SShift, SShiftStart, SShiftEnd) (SELECT DISTINCT Name, @Date, Shift, CASE WHEN Shift='AM' THEN CONVERT(datetime,@Date)+'05:45' WHEN Shift='PM' THEN CONVERT(datetime,@Date)+'17:45' WHEN Shift='Morning' THEN CONVERT(datetime,@Date)+'05:45' WHEN Shift='Afternoon' THEN CONVERT(datetime,@Date)+'13:45' WHEN Shift='Night' THEN CONVERT(datetime,@Date)+'21:45' END, CASE WHEN Shift='AM' THEN CONVERT(datetime,@Date)+'18:15' WHEN Shift='PM' THEN DATEADD(Day,1,CONVERT(datetime,@Date))+'06:15' WHEN Shift='Morning' THEN CONVERT(datetime,@Date)+'14:45' WHEN Shift='Afternoon' THEN CONVERT(datetime,@Date)+'22:45' WHEN Shift='Night' THEN DATEADD(Day,1,CONVERT(datetime,@Date))+'06:45' END FROM ApplicationAuthentication.dbo.aspnet_Users WHERE Name IN (SELECT MUsername FROM @Movements)) SET @Date=DATEADD(Day,1,@Date) END UPDATE @Shifts SET SMovements= CASE WHEN SShift='AM' THEN (SELECT COUNT(MTimestamp)FROM @Movements WHERE MUsername=SUsername AND MTimestamp BETWEEN CONVERT(datetime,SDate)+'06:00' AND CONVERT(datetime,SDate)+'18:15') WHEN SShift='PM' THEN (SELECT COUNT(MTimestamp)FROM @Movements WHERE MUsername=SUsername AND MTimestamp BETWEEN CONVERT(datetime,SDate)+'18:00' AND DATEADD(Day,1,CONVERT(datetime,SDate))+'06:15') WHEN SShift='Morning' THEN (SELECT COUNT(MTimestamp)FROM @Movements WHERE MUsername=SUsername AND MTimestamp BETWEEN CONVERT(datetime,SDate)+'06:00' AND CONVERT(datetime,SDate)+'14:45') WHEN SShift='Afternoon' THEN (SELECT COUNT(MTimestamp)FROM @Movements WHERE MUsername=SUsername AND MTimestamp BETWEEN CONVERT(datetime,SDate)+'14:00' AND CONVERT(datetime,SDate)+'22:45') WHEN SShift='Night' THEN (SELECT COUNT(MTimestamp)FROM @Movements WHERE MUsername=SUsername AND MTimestamp BETWEEN CONVERT(datetime,SDate)+'22:00' AND DATEADD(Day,1,CONVERT(datetime,SDate))+'06:45') END DELETE FROM @Shifts WHERE SMovements<20 SET @ShiftRecord=(SELECT MIN(SID)FROM @Shifts) WHILE @ShiftRecord IS NOT NULL BEGIN INSERT INTO @ShiftData ( Product, PalletRef, Location, Action, PickType, Timestamp) (SELECT Mproduct, MPalletRef, MLocation, MAction, MPickType, MTimestamp FROM @Movements WHERE MUsername=(SELECT SUsername FROM @Shifts WHERE SID=@ShiftRecord) AND MTimestamp BETWEEN (SELECT SShiftStart FROM @Shifts WHERE SID=@ShiftRecord) AND (SELECT SShiftEnd FROM @Shifts WHERE SID=@ShiftRecord)) SET @Counter=(SELECT COUNT(MID)FROM @Movements) WHILE @Counter>0 BEGIN UPDATE @ShiftData SET Duration=ISNULL((SELECT Timestamp FROM @ShiftData WHERE ID=@Counter+1)-Timestamp,'00:03:00'), Consecutive= CASE WHEN (SELECT Action FROM @ShiftData WHERE ID=@Counter-1)=Action THEN '1' ELSE '0' END WHERE ID=@Counter SET @Counter=@Counter-1 END INSERT INTO @CompiledData (Username, Site, Date, Shift, Average, Consecutive, StandardRetrieval, FreeRetrieval, RDTRetrieval, PutAway, TotalTime, RDTNonUsage, TotalSeconds, AverageSeconds) (SELECT (SELECT SUsername FROM @Shifts WHERE SID=@ShiftRecord), (SELECT Site FROM ApplicationAuthentication.dbo.aspnet_Users WHERE Name=(SELECT SUsername FROM @Shifts WHERE SID=@ShiftRecord)), (SELECT SDate FROM @Shifts WHERE SID=@ShiftRecord), (SELECT SShift FROM @Shifts WHERE SID=@ShiftRecord), SUBSTRING(CONVERT(varchar(50),(CAST(CAST(AVG(CAST(CAST(Duration AS datetime)AS FLOAT))AS datetime)AS TIME)),13),1,8)AS Average, (SELECT SUM(Consecutive))AS Consecutive, (SELECT COUNT(Action) FROM @ShiftData WHERE PickType='Retrieve (SP)')AS StandardRetrieval, (SELECT COUNT(Action) FROM @ShiftData WHERE PickType='Retrieve (FP)')AS FreeRetrieval, (SELECT COUNT(Action) FROM @ShiftData WHERE PickType='Retrieve (RDT)')AS RDTRetrieval, (SELECT COUNT(Action) FROM @ShiftData WHERE PickType='Put Away')AS Putaway, SUBSTRING(CONVERT(varchar(50),(CAST(CAST(SUM(CAST(CAST(Duration AS datetime)AS FLOAT))AS datetime)AS TIME)),13),1,8)AS TotalTime, CAST((CAST(SUM(Consecutive)AS decimal(6,1)))/(COUNT(Action))*100 AS decimal(6,1))AS RDTNonUsage, CONVERT(INT, DATEDIFF(SECOND, '19000101',SUBSTRING(CONVERT(varchar(50),(CAST(CAST(SUM(CAST(CAST(Duration AS datetime)AS FLOAT))AS datetime)AS TIME)),13),1,8))), CONVERT(INT, DATEDIFF(SECOND, '19000101',SUBSTRING(CONVERT(varchar(50),(CAST(CAST(AVG(CAST(CAST(Duration AS datetime)AS FLOAT))AS datetime)AS TIME)),13),1,8))) FROM @ShiftData) DELETE FROM @ShiftData DELETE FROM @Shifts WHERE SID=@ShiftRecord SET @ShiftRecord=(SELECT MIN(SID)FROM @Shifts) END INSERT INTO @Summary (SUMUsername, Site, Shift) (SELECT DISTINCT Username, Site, Shift FROM @CompiledData) UPDATE @Summary SET ShiftsWorked=(SELECT COUNT(Username)FROM @CompiledData WHERE Username=SUMUsername), StandardRetrieval=(SELECT SUM(StandardRetrieval)FROM @CompiledData WHERE Username=SUMUsername), FreeRetrieval=(SELECT SUM(FreeRetrieval)FROM @CompiledData WHERE Username=SUMUsername), RDTRetrieval=(SELECT SUM(RDTRetrieval)FROM @CompiledData WHERE Username=SUMUsername), PutAway=(SELECT SUM(PutAway)FROM @CompiledData WHERE Username=SUMUsername), TotalTime=CONVERT(varchar(6), (SELECT SUM(TotalSeconds)FROM @CompiledData WHERE Username=SUMUsername)/3600) + ':'+ RIGHT('0' + CONVERT(varchar(2), ((SELECT SUM(TotalSeconds)FROM @CompiledData WHERE Username=SUMUsername) % 3600) / 60), 2) + ':' + RIGHT('0' + CONVERT(varchar(2), (SELECT SUM(TotalSeconds)FROM @CompiledData WHERE Username=SUMUsername) % 60), 2), Average=CONVERT(CHAR(8), DATEADD(SECOND,(SELECT AVG(AverageSeconds)FROM @CompiledData WHERE Username=SUMUsername),''),114), Consecutive=(SELECT SUM(Consecutive)FROM @CompiledData WHERE Username=SUMUsername), RDTNonUsage =(SELECT SUM(RDTNonUsage)FROM @CompiledData WHERE Username=SUMUsername)/(SELECT COUNT(RDTNonUsage)FROM @CompiledData WHERE Username=SUMUsername) SELECT * FROM @Summary ORDER BY SUMUsername