Tengo una table en Access donde tengo tres campos:
- Nombres de jugadores de futbol.
- Las puntuaciones totales para cada uno de ellos (1000 puntos, 858 puntos, etc…) y que es la suma de todos los puntos que le han dado los usuarios.
- El número de votos dados a cada jugador (número de personas que han votado a fulanito o a menganito).
Bien, ahora imaginad que quiero presentar los jugadores en orden descendente en función de su valoración (el jugador mejor valorado arriba, y el peor valorado al final). Como no tengo un campo en la base de datos que informe de cual es el mejor valorado, tenemos que hacer una operación dividiendo el campo valoracion_total (que es el total de puntos recibidos por cada jugador), entre veces_valorado (veces que se ha votado por ese jugador).
Problema que surge: Hay jugadores que no han recibido ninguna valoración, por lo que cero dividido entre cero, da error. Es decir, una consulta de este tipo, no funciona:
Código:
Para solucionarlo, se me ha ocurrido seleccionar primero el grupo de jugadores que han sido valorados más de cero veces (1, 2, 3, ...o n veces), es decir, veces_valorado > 0, y después añadir a continuación el grupo de jugadores que no han tenido valoración. Es decir, uniendo estas 2 consultas:SELECT * FROM jugadores ORDER BY (valoracion_total/veces_valorado) DESC
[color=green]
Código:
SELECT * FROM jugadores WHERE veces_valorado>0 ORDER BY (valoracion_total/veces_valorado) DESC, veces_valorado DESC, jugador ASC
Código:
La primera de esas dos sentencias ordenaría los jugadores con alguna valoración, primero en función de la división valoracion_total/veces_valorado, es decir, en función del jugador mejor valorado al peor valorado. Luego, si varios jugadores tienen la misma valoración, que lo ordene en función de las veces que ha sido valorado cada jugador (esto es útil por ejemplo, para diferenciar un jugador que tiene 1 solo voto, y a la que le han dado 10 puntos, de otro jugador que tiene 3 votos y a la que le han dado 30 puntos en total, ...en ambos casos, la valoración del jugador es de 10 puntos, pero quiero que presente primero los que más votos han tenido, es decir, ese jugador al que han votado 3 veces). Luego, en caso de empates, mostraría los jugadores por su nombre, en orden alfabético ascendente.SELECT * FROM jugadores WHERE veces_valorado=0 ORDER BY jugador ASC
La segunda consulta mostraría los jugadores que no han sido valoradas, por el su nombre, de forma ascendente.
Problemaaaaaaaaaaaa: Si uno ambas sentencias, no me mantiene el orden lógico por el que me debería mostrar los jugadores. Es decir, si utilizo la siguiente consulta, me muestra los jugadores por su nombre de forma ascendente, con independencia de la puntuación recibida por cada jugador:
Código:
A ver si me podéis decir que estoy haciendo mal para que no me muestre la consulta, tal y como yo la he especificado (desconozco si UNION ALL sirve para unir dos grupos de datos de una misma tabla, porque siempre la he visto utilizada para tablas diferentes).(SELECT * FROM jugadores WHERE veces_valorado>0 ORDER BY (valoracion_total/veces_valorado) DESC, veces_valorado DESC, jugador ASC) UNION ALL (SELECT * FROM jugadores WHERE veces_valorado=0 ORDER BY jugador ASC)
Gracias miles.