Tout d'abord, vous n'avez pas besoin des sous-requêtes, vous pouvez plutôt compter sur une condition.
Le with rollup
le modificateur peut être ajouté au group by clause pour inclure le grand total. Le order by ne peut alors pas être utilisé dans la même requête, mais peut être appliqué dans une requête externe.
De plus, avec l'utilisation de coalesce vous pouvez remplacer le null valeur pour cette ligne totale avec l'étiquette de votre choix.
Enfin, pour toujours trier la ligne totale à la fin, vous pouvez ajouter un is null expression dans le order by clause, qui sera évaluée à false ou true . Ce dernier est commandé en dernier.
select coalesce(checkby, 'Total') as checkby_or_total,
fully,
faulty,
lasthour,
total
from (
select qcheck.checkby,
count(case result when 'fully tested & working' then 1 end) as fully,
count(case result when 'faulty' then 1 end) as faulty,
count(case when finishdate >= now()-interval 1 hour then 1 end) as lasthour,
count(*) as total
from qcheck
where date(finishdate) = CURDATE()
and qcheck.checkby not like 'michael'
and qcheck.checkby not like 'chaz'
group by qcheck.checkby with rollup
) as main
order by checkby is null,
total desc