WITH SORTERS AS ( SELECT MIN(s04_timestamp) AS start_timestamp, MAX(s04_timestamp) AS end_timestamp, 3600/TIMESTAMPDIFF(SECOND, :startDate, :endDate) AS pph_multiplier, sorter, COUNT(*) AS total, SUM(sort_code="Success") AS success, SUM(sort_code IN ("Dest Invalid", "Dest None", "Underutilized")) AS awcs, SUM(sort_code IN ("Dest Disabled", "Dest Full", "Dim Error", "Unexpected", "Weight Err")) AS operational, SUM(sort_code IN ("Dest Fault", "Div Fail", "Gap Err", "Lost", "Rate High", "Track Err", "Unknown", "Unsafe")) AS machine, SUM(sort_code IN ("No Read", "No Code", "Multi Label")) AS scanner FROM package_history WHERE s04_timestamp BETWEEN :startDate AND :endDate GROUP BY sorter ORDER BY sorter ) SELECT start_timestamp, end_timestamp, sorter, /* Counts: */ total AS total_count, success AS success_count, awcs AS awcs_issues_count, operational AS operational_issues_count, machine AS machine_issues_count, scanner AS scanner_issues_count, /* PPH: */ ROUND(total*pph_multiplier) AS total_pph, ROUND(success*pph_multiplier) AS success_pph, ROUND(awcs*pph_multiplier) AS awcs_issues_pph, ROUND(operational*pph_multiplier) AS operational_issues_pph, ROUND(machine*pph_multiplier) AS machine_issues_pph, ROUND(scanner*pph_multiplier) AS scanner_issues_pph, /* Percents: */ ROUND(total/total, 4) AS total_percent, ROUND(success/total, 4) AS success_percent, ROUND(awcs/total, 4) AS awcs_issues_percent, ROUND(operational/total, 4) AS operational_issues_percent, ROUND(machine/total, 4) AS machine_issues_percent, ROUND(scanner/total, 4) AS scanner_issues_percent FROM SORTERS;