WITH jam_data AS ( /* TRUE JAM COUNTS PER DEVICE */ SELECT Name, COUNT(*) AS Jam_count FROM ( /* AREA JAMS */ SELECT Name, t_stamp FROM jam_area WHERE t_stamp BETWEEN :starttime AND :endtime UNION ALL /* DEVICE JAMS – EDGE DETECT */ SELECT Name, t_stamp FROM ( SELECT Name, t_stamp, Jam, IF(@lastName = Name, @prevJam, 0) AS prevJam, @prevJam := Jam, @lastName := Name FROM lane_data JOIN (SELECT @prevJam := 0, @lastName := '') AS vars WHERE t_stamp BETWEEN :starttime AND :endtime ORDER BY Name, t_stamp ) AS x WHERE Jam = 1 AND prevJam = 0 ) all_jams GROUP BY Name ), total AS ( SELECT SUM(Jam_count) AS Total_jams FROM jam_data ) SELECT jd.Name, ROUND((jd.Jam_count / t.Total_jams) * 100, 2) AS Jam_percentage FROM jam_data jd JOIN total t WHERE t.Total_jams > 0 UNION ALL /* FALLBACK IF NOTHING EXISTS */ SELECT 'N/A' AS Name, 0 AS Jam_percentage WHERE NOT EXISTS ( SELECT 1 FROM jam_data ) ORDER BY Jam_percentage DESC;