WITH SORTERS AS ( SELECT DATE_FORMAT(MIN(s04_timestamp), "%Y-%m-%d %H:%i:00") AS time, 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 AND sorter = :sorter GROUP BY DATE_FORMAT(s04_timestamp, "%Y-%m-%d %H:%i:00") ORDER BY DATE_FORMAT(s04_timestamp, "%Y-%m-%d %H:%i:00") ) SELECT time, /* 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*60) AS total_pph, ROUND(success*60) AS success_pph, ROUND(awcs*60) AS awcs_issues_pph, ROUND(operational*60) AS operational_issues_pph, ROUND(machine*60) AS machine_issues_pph, ROUND(scanner*60) AS scanner_issues_pph, /* Percents: */ 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;