RANKING con SQL

11/02/2004 - 16:31 por PA | Informe spam
Hola que tal?

mi problema es no saber como hacer con sql lo siguiente:
Yo registro en una tabla JUGDAS un IDJUGADOR y un PUNTAJE

lo que hago es lo siguiente.
primero que me tire los 10 primeros puestos... esto es sencillo.

select top 10 idjugador, sum (puntaje) as suma from jugadas
group by idjugador
order by suma desc

pero lo que nose como hacer es que luego de ese listado me tire la posicion
de otro jugador que por ejemplo esta nro 42.


en otras palabras el resultado que quisiera obtener es el sig.:
el jugador 11 participa del juego, obtiene 1 punto y al finalizar se le
muestra los primeros 10 puestos y el puesto de el que en este caso seria el
42

pos IDJUGADOR PUNTOS
1 1 100
2 2 90
3 3 80
4 4 70
5 5 60
6 6 50

7 7 40

8 8 30

9 9 20
10 10 10

42 11 1


yo lo que necesito es ese 42!!!!!!!!!!!!!
la primer parte la obtengo con la consulta arriba mensionada pero la
posicion del jugador 11 como la obtengo?

espero que me puedan ayudar...


saludos

Pablo

Preguntas similare

Leer las respuestas

#6 Javier Loria
11/02/2004 - 18:01 | Informe spam
Hola Pablo:
Vamos a ver si me puedo explicar porque este tipo de consulta es bien
compleja.
Lo primero es que en SQL no existe ese concepto de numero de fila y hay que
crearlo con un "truco". En este caso si la consulta que da los resultados
que deseas numerar es:
=SELECT IdJugador,
SUM(Puntaje) as Suma
FROM Jugadas
GROUP BY IdJugador
=Una consulta que numera la posicion del jugador con respecto al conjunto
seria:
=SELECT COUNT(*) AS Posicion
, J1.IdJugador
, J1.Suma
FROM ( SELECT IdJugador, SUM(Puntaje) as Suma
FROM Jugadas GROUP BY IdJugador
)AS J1
JOIN ( SELECT IdJugador, SUM(Puntaje) as Suma
FROM Jugadas GROUP BY IdJugador
)AS J2
ON J1.Suma<=J2.Suma
GROUP BY , J1.IdJugador
, J1.Suma
= Esta consulta cuenta cuantos jugadores tuvieron mas o igual cantidad de
puntos incluyendo al mismo jugador, lo cual en empates da la posicion mas
baja(el numero mas alto), si requieres la posicion mas alta (numero mas
bajo) cambia la condicion del ON a J1.Suma<J2.Suma y agrega uno al COUNT(*).
Si toda esta consulta es la encierras entre parentis y le pones un
filtro deberas tener la fila deseada:
=SELECT *
FROM (.) AS T1
WHERE T1.IdJugador=@IdJugador

Este codigo NO es rapido, y es complejo darle mantenimiento. Pero espero te
sirva,

Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.

PA escribio:
Hola que tal?

mi problema es no saber como hacer con sql lo siguiente:
Yo registro en una tabla JUGDAS un IDJUGADOR y un PUNTAJE

lo que hago es lo siguiente.
primero que me tire los 10 primeros puestos... esto es sencillo.

select top 10 idjugador, sum (puntaje) as suma from jugadas
group by idjugador
order by suma desc

pero lo que nose como hacer es que luego de ese listado me tire la
posicion de otro jugador que por ejemplo esta nro 42.


en otras palabras el resultado que quisiera obtener es el sig.:
el jugador 11 participa del juego, obtiene 1 punto y al finalizar se
le muestra los primeros 10 puestos y el puesto de el que en este caso
seria el 42

pos IDJUGADOR PUNTOS
1 1 100
2 2 90
3 3 80
4 4 70
5 5 60
6 6 50

7 7 40

8 8 30

9 9 20
10 10 10

42 11 1


yo lo que necesito es ese 42!!!!!!!!!!!!!
la primer parte la obtengo con la consulta arriba mensionada pero la
posicion del jugador 11 como la obtengo?

espero que me puedan ayudar...


saludos

Pablo
Respuesta Responder a este mensaje
#7 Norman A. Armas
11/02/2004 - 18:03 | Informe spam
Tu leistes bien mi propuesta?
Porque de ser asi no entendistes para nada mi solucion.
Leela de nuevo y emite el criterio despues.

Saludos,

Norman



"PA" wrote in message
news:
el tema es que de esta manera me devolveria la cantidad de fijas hasta el
jugador... osea
si el jugador esta en la posicion nro 400 me devolveria 400 filas lo


que
quiero es que me devuelva 20 y en la 21... me diga "vos estas en la


posicion
400"!!!

resolvi el problema de la siguiente manera, lo unico es que no me
gusta mucho por lo que hice fue crear un SP y dentro del mismo un
cursor
lo que hago es enviarle por parametro el ID del jugador y me devuelve la
posicion..

nose si es la mas eficiente pero se me ocurrio aso por el momento.

Gracias!!!


"Norman A. Armas" escribió en el mensaje
news:#
> Mas o menos asi
>
> select
> identity(int,1,1) as pos,idjugador,sum(puntaje) as puntos
> into #t
> from
> jugdas
> group by
> idjugador
> order by
> sum(puntaje) desc
>
> select * from #t where pos <= 10 or idjugadorB
>
> drop table #t
> > > Saludos,
>
> Norman
>
>
>
> "PA" wrote in message
> news:%
> > Hola que tal?
> >
> > mi problema es no saber como hacer con sql lo siguiente:
> > Yo registro en una tabla JUGDAS un IDJUGADOR y un PUNTAJE
> >
> > lo que hago es lo siguiente.
> > primero que me tire los 10 primeros puestos... esto es sencillo.
> >
> > select top 10 idjugador, sum (puntaje) as suma from jugadas
> > group by idjugador
> > order by suma desc
> >
> > pero lo que nose como hacer es que luego de ese listado me tire la
> posicion
> > de otro jugador que por ejemplo esta nro 42.
> >
> >
> > en otras palabras el resultado que quisiera obtener es el sig.:
> > el jugador 11 participa del juego, obtiene 1 punto y al finalizar se


le
> > muestra los primeros 10 puestos y el puesto de el que en este caso


seria
> el
> > 42
> >
> > pos IDJUGADOR PUNTOS
> > 1 1 100
> > 2 2 90
> > 3 3 80
> > 4 4 70
> > 5 5 60
> > 6 6 50
> >
> > 7 7 40
> >
> > 8 8 30
> >
> > 9 9 20
> > 10 10 10
> >
> > 42 11 1
> >
> >
> > yo lo que necesito es ese 42!!!!!!!!!!!!!
> > la primer parte la obtengo con la consulta arriba mensionada pero la
> > posicion del jugador 11 como la obtengo?
> >
> > espero que me puedan ayudar...
> >
> >
> > saludos
> >
> > Pablo
> >
> >
> >
>
>


Respuesta Responder a este mensaje
#8 Maximiliano D. A.
11/02/2004 - 18:43 | Informe spam
Norman es buena esa solucion!!! y mas facil de administrar, claro tenes una
tabla tenporal no? pero vale
igual.
Maximiliano Damian Accotto


"Norman A. Armas" escribió en el mensaje
news:%
Mas o menos asi

select
identity(int,1,1) as pos,idjugador,sum(puntaje) as puntos
into #t
from
jugdas
group by
idjugador
order by
sum(puntaje) desc

select * from #t where pos <= 10 or idjugadorB

drop table #t
> Saludos,

Norman



"PA" wrote in message
news:%
> Hola que tal?
>
> mi problema es no saber como hacer con sql lo siguiente:
> Yo registro en una tabla JUGDAS un IDJUGADOR y un PUNTAJE
>
> lo que hago es lo siguiente.
> primero que me tire los 10 primeros puestos... esto es sencillo.
>
> select top 10 idjugador, sum (puntaje) as suma from jugadas
> group by idjugador
> order by suma desc
>
> pero lo que nose como hacer es que luego de ese listado me tire la
posicion
> de otro jugador que por ejemplo esta nro 42.
>
>
> en otras palabras el resultado que quisiera obtener es el sig.:
> el jugador 11 participa del juego, obtiene 1 punto y al finalizar se le
> muestra los primeros 10 puestos y el puesto de el que en este caso seria
el
> 42
>
> pos IDJUGADOR PUNTOS
> 1 1 100
> 2 2 90
> 3 3 80
> 4 4 70
> 5 5 60
> 6 6 50
>
> 7 7 40
>
> 8 8 30
>
> 9 9 20
> 10 10 10
>
> 42 11 1
>
>
> yo lo que necesito es ese 42!!!!!!!!!!!!!
> la primer parte la obtengo con la consulta arriba mensionada pero la
> posicion del jugador 11 como la obtengo?
>
> espero que me puedan ayudar...
>
>
> saludos
>
> Pablo
>
>
>


Respuesta Responder a este mensaje
#9 ulises
11/02/2004 - 23:58 | Informe spam
Una más para la carpeta "\Tips JLoria\" :)

Saludos,
Ulises

Hola Pablo:
Vamos a ver si me puedo explicar porque este tipo de


consulta es bien
compleja.
Lo primero es que en SQL no existe ese concepto de numero


de fila y hay que
crearlo con un "truco". En este caso si la consulta que


da los resultados
que deseas numerar es:
=>SELECT IdJugador,
SUM(Puntaje) as Suma
FROM Jugadas
GROUP BY IdJugador
=>Una consulta que numera la posicion del jugador con


respecto al conjunto
seria:
=>SELECT COUNT(*) AS Posicion
, J1.IdJugador
, J1.Suma
FROM ( SELECT IdJugador, SUM(Puntaje) as Suma
FROM Jugadas GROUP BY IdJugador
)AS J1
JOIN ( SELECT IdJugador, SUM(Puntaje) as Suma
FROM Jugadas GROUP BY IdJugador
)AS J2
ON J1.Suma<=J2.Suma
GROUP BY , J1.IdJugador
, J1.Suma
=> Esta consulta cuenta cuantos jugadores tuvieron mas o


igual cantidad de
puntos incluyendo al mismo jugador, lo cual en empates da


la posicion mas
baja(el numero mas alto), si requieres la posicion mas


alta (numero mas
bajo) cambia la condicion del ON a J1.Suma<J2.Suma y


agrega uno al COUNT(*).
Si toda esta consulta es la encierras entre parentis


y le pones un
filtro deberas tener la fila deseada:
=>SELECT *
FROM (.) AS T1
WHERE T1.IdJugador=@IdJugador



Este codigo NO es rapido, y es complejo darle


mantenimiento. Pero espero te
sirva,

Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.

PA escribio:
Hola que tal?

mi problema es no saber como hacer con sql lo siguiente:
Yo registro en una tabla JUGDAS un IDJUGADOR y un




PUNTAJE

lo que hago es lo siguiente.
primero que me tire los 10 primeros puestos... esto es




sencillo.

select top 10 idjugador, sum (puntaje) as suma




from jugadas
group by idjugador
order by suma desc

pero lo que nose como hacer es que luego de ese listado




me tire la
posicion de otro jugador que por ejemplo esta nro 42.


en otras palabras el resultado que quisiera obtener es




el sig.:
el jugador 11 participa del juego, obtiene 1 punto y al




finalizar se
le muestra los primeros 10 puestos y el puesto de el




que en este caso
seria el 42

pos IDJUGADOR PUNTOS
1 1




100
2 2




90
3 3




80
4 4




70
5 5




60
6 6




50

7 7




40

8 8




30

9 9




20
10 10 10

42 11 1


yo lo que necesito es ese 42!!!!!!!!!!!!!
la primer parte la obtengo con la consulta arriba




mensionada pero la
posicion del jugador 11 como la obtengo?

espero que me puedan ayudar...


saludos

Pablo




.

Respuesta Responder a este mensaje
#10 Manuel Etcheto
12/02/2004 - 05:41 | Informe spam
Hola Pablo
Te había enviado a la tarde un sp al grupo de ASP para
recoger solamente la posición de un determinado jugador,
sin cursor ni tabla temporal
Aquí te mando uno más completo, para obtener todo desde
asp con un solo Command (1 Rset + 2 parámetros de salida)

CREATE PROCEDURE Top10MasPuntajeyRankingPropio
(@miCodigo int, @mipuntaje int output, @miranking int
output)
AS
SELECT @mipuntaje = SUM(puntaje) FROM Jugadas
WHERE idjugador = @micodigo
SELECT @miranking = COUNT(cant) + 1 FROM
(SELECT COUNT(idjugador) cant FROM Jugadas
GROUP BY idjugador HAVING SUM(puntaje) > @mipuntaje) as T
SELECT TOP 10 WITH TIES idjugador, SUM(puntaje) AS suma
FROM Jugadas
GROUP BY idjugador
ORDER BY suma DESC
GO

Suerte
Manuel

Hola que tal?

mi problema es no saber como hacer con sql lo siguiente:
Yo registro en una tabla JUGDAS un IDJUGADOR y un PUNTAJE

lo que hago es lo siguiente.
primero que me tire los 10 primeros puestos... esto es


sencillo.

select top 10 idjugador, sum (puntaje) as suma from


jugadas
group by idjugador
order by suma desc

pero lo que nose como hacer es que luego de ese listado


me tire la posicion
de otro jugador que por ejemplo esta nro 42.


en otras palabras el resultado que quisiera obtener es el


sig.:
el jugador 11 participa del juego, obtiene 1 punto y al


finalizar se le
muestra los primeros 10 puestos y el puesto de el que en


este caso seria el
42

pos IDJUGADOR PUNTOS
1 1 100
2 2 90
3 3 80
4 4 70
5 5 60
6 6 50

7 7 40

8 8 30

9 9 20
10 10 10

42 11 1


yo lo que necesito es ese 42!!!!!!!!!!!!!
la primer parte la obtengo con la consulta arriba


mensionada pero la
posicion del jugador 11 como la obtengo?

espero que me puedan ayudar...


saludos

Pablo



.

email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida