SELECT concat(date(alltable.t_stamp), ' ', hour(alltable.t_stamp), ':00') as StartTimestamp, concat('H',TIMESTAMPDIFF(HOUR,DATE_FORMAT(alltable.t_stamp,"%Y-%m-%d %H:00:00"),DATE_FORMAT(now(),"%Y-%m-%d %H:00:00"))) as Hour, concat(round(COUNT(*)/COUNT(*) * 100,2),'%') AS Total, concat(round(SUM(SUBSTRING(alltable.ScanLabel,1,1) <> '?' AND SUBSTRING(alltable.ScanLabel,1,1) <> '9' AND SUBSTRING(alltable.ScanLabel,1,1) <> '0')/COUNT(*) * 100,2),'%') AS GoodRead, concat(round(SUM(SUBSTRING(alltable.ScanLabel,1,1) = '?')/COUNT(*) * 100,2),'%') AS NoRead, concat(round(SUM(SUBSTRING(alltable.ScanLabel,1,1) = '9')/COUNT(*) * 100,2),'%') AS MultiRead, concat(round(SUM(SUBSTRING(alltable.ScanLabel,1,1) = '0')/COUNT(*) * 100,2),'%') AS NoCode FROM alltable Where (alltable.t_stamp BETWEEN :starttime AND :endtime) GROUP BY hour(alltable.t_stamp)