WITH INDUCTS AS ( SELECT MIN(s04_timestamp) AS start_timestamp, MAX(s04_timestamp) AS end_timestamp, sorter, induct, COUNT(*) AS total, SUM(carriers=1) AS single_carrier, SUM(carriers=2) AS double_carrier, AVG(pkg_length/10) AS pkg_length_avg, AVG(gap_leading/10) AS gap_avg FROM package_history WHERE s04_timestamp BETWEEN :startDate AND :endDate GROUP BY sorter, induct ), SORTERS AS ( SELECT sorter, 3600/TIMESTAMPDIFF(SECOND, :startDate, :endDate) AS pph_multiplier, SUM(total) AS total FROM INDUCTS GROUP BY sorter ) SELECT I.start_timestamp, I.end_timestamp, S.sorter, I.induct, /* Averages: */ ROUND(I.pkg_length_avg, 1) AS 'avg_package_length_(")', ROUND(I.gap_avg, 1) AS 'avg_gap_(")', /* Counts: */ I.total AS total_count, I.single_carrier AS single_carrier_count, I.double_carrier AS double_carrier_count, /* PPH: */ ROUND(I.total*S.pph_multiplier) AS total_pph, ROUND(I.single_carrier*S.pph_multiplier) AS single_carrier_pph, ROUND(I.double_carrier*S.pph_multiplier) AS double_carrier_pph, /* Percents: */ ROUND(I.total/S.total, 4) AS 'total/sorter_percent', ROUND(I.single_carrier/I.total, 4) AS single_carrier_percent, ROUND(I.double_carrier/I.total, 4) AS double_carrier_percent FROM INDUCTS I, SORTERS S WHERE I.sorter = S.sorter ORDER BY S.sorter, I.induct;