2010-10-12 8 views
3

J'utilise PHP/MySQL pour créer un site Web qui affiche les résultats de la course. Je veux afficher une statistique des 10 courses les plus difficiles, c'est-à-dire les courses que la plupart des gens DNF. Je le fais comme ceci:Avec SQL, comment calculer le pourcentage de lignes ayant une certaine valeur?

select raceid,race.name,race.location,race.date,count(result.raceid) as dnfs 
from result 
inner join race on result.raceid=race.id 
where result.place=0 
group by result.raceid 
order by dnfs desc limit 10 

Mais cela ne prend pas en compte le nombre de personnes dans la course. Comment modifier la requête pour renvoyer également percentDNF (dnfs/totalracers) et commander par cette colonne? Un lieu = 0 signifie DNF.

+0

DNF? Duke Nukem pour toujours? –

+8

"N'a pas fini". Alors, ouais, Duke Nukem Forever. :) –

+0

Il n'aurait pas pu y avoir de meilleure réponse. –

Répondre

12

Supprimez la clause WHERE et utilisez une instruction CASE à la place pour calculer la valeur did-not-finish. Ensuite, divisez cela par le nombre total de coureurs. Quelque chose comme ceci:

SELECT result.raceid, race.name, race.location, race.date, 
     COUNT(result.raceid) AS TOTAL, 
     SUM(CASE WHEN result.place = 0 THEN 1 ELSE 0 END) AS DNF, 
     SUM(CASE WHEN result.place = 0 THEN 1 ELSE 0 END)/
      COUNT(result.raceid) AS PCT_DNF 
    FROM result 
     JOIN race ON result.raceid=race.id 
GROUP BY result.raceid, race.name, race.location, race.date 
ORDER BY SUM(CASE WHEN result.place = 0 THEN 1 ELSE 0 END)/
      COUNT(result.raceid) DESC LIMIT 10 
+0

Merci, a parfaitement fonctionné. –

3

je ne sais pas si cela fonctionne pour mysql, dans le serveur SQL, il peut être: select ((select count (*) à partir TBL où criterie) * 100)/(select count (*) à partir TBL)

Questions connexes