Principales respuestas
agrupar y ordenar por grupo

Pregunta
-
buenas noches!! como estan todos? espero que bien!!
mi consulta es la siguiente, me quedaron algunas cositas por sumar al trabajo que venia haciendo..
tengo un procedimiento almacenado en donde muestra los atletas participantes de una competencia determinada, los cuales participan todos juntos (edades varias, ambos sexos).
ahora lo que necesito es poder mostrar ese listado de atletas ordenados por rangos de edades y sexo (ejemplo: mujeres de 20-29, mujeres de 30-39.....hombres de 20-29, hombres de 30-39..... ) y a su vez cada rango ordenado por tiempo (de menor a mayor)
(nota: tener en cuenta que puede no haber ningun atleta en el rango mujeres de 20-29 por ejemplo....)
esto es lo que tengo hasta el dia de hoy..nuevamente muchas gracias!!
if OBJECT_ID ('RangoEdades') IS not null
drop proc RangoEdades
go
create proc RangoEdades
as
begin
SELECT
dbo.Atleta_X_Competencia.Id_Competencia,
dbo.Competencia.Nombre_Competencia,
dbo.Competencia.Lugar_Competencia,
dbo.Competencia.Distancia,
dbo.Competencia.Fecha_Inicio,
dbo.Competencia.Hora_Inicio,
dbo.Provincia.Nombre_Provincia,
dbo.Localidad.Nombre_Localidad,
dbo.Atleta_X_Competencia.Id_Atleta,
dbo.Atleta.Nombre_Atleta,
dbo.Atleta.Apellido_Atleta,
DATEDIFF (year,dbo.Atleta.Fecha_Nacimiento, GETDATE()) as Edad,
dbo.Sexo.Sexo,
dbo.Atleta.Otra_Institución,
dbo.Atleta_X_Competencia.Id_Resultados_X_Competencia,
dbo.Resultados_X_Competencia.Mejor,
dbo.Resultados_X_Competencia.Posicion,
dbo.Juez.Apellido_Juez,
dbo.Resultados_X_Competencia.Dorsal,
t.t3 AS [RangoEdades]
FROM dbo.Atleta
INNER JOIN dbo.Atleta_X_Competencia
ON dbo.Atleta.Id_Atleta = dbo.Atleta_X_Competencia.Id_Atleta
INNER JOIN dbo.Competencia
ON dbo.Atleta_X_Competencia.Id_Competencia = dbo.Competencia.Id_Competencia
INNER JOIn dbo.Sexo
ON dbo.Atleta.Id_Sexo = dbo.Sexo.Id_sexo
INNER JOIN dbo.Resultados_X_Competencia
ON dbo.Atleta_X_Competencia.Id_Resultados_X_Competencia = dbo.Resultados_X_Competencia.Id_Resultados_X_Competencia
INNER JOIN dbo.Localidad
ON dbo.Competencia.Id_Localidad = dbo.Localidad.Id_Localidad
INNER JOIN dbo.Provincia
ON dbo.Provincia.Id_Provincia =dbo.Competencia.Id_Provincia
inner join Juez
on juez.Id_Juez=Resultados_X_Competencia.Id_Juez
INNER JOIN (VALUES
(10, 15, 'De 10 a 15 años'),
(16, 20, 'De 16 a 20 años'),
(21, 25, 'De 21 a 25 años'),
(26, 30, 'De 26 a 30 años'),
(31, 35, 'De 31 a 35 años'),
(36, 40, 'De 36 a 40 años'),
(31, 35, 'De 41 a 45 años'),
(36, 40, 'De 46 a 50 años'),
(31, 35, 'De 51 a 55 años'),
(36, 40, 'De 56 a 60 años'),
(31, 35, 'De 61 a 65 años'),
(31, 35, 'De 66 a 70 años'),
(31, 35, 'De 71 a 75 años'),
(36, 40, 'De 76 a 80 años'),
(31, 35, 'De 81 a 85 años'),
(36, 40, 'De 86 a 90 años'),
(31, 35, 'De 91 a 95 años'),
(36, 40, 'De 96 a 100 años'))
AS T (t1, t2, t3)
ON CONVERT(int, DATEDIFF(d, atleta.Fecha_Nacimiento, GETDATE())/365.25)
BETWEEN T.t1 AND T.t2
WHERE Atleta_X_Competencia.Id_Competencia=(SELECT MAX(Id_Competencia) FROM Competencia)
order by Atleta.Apellido_Atleta asc
end
go
valeria heredia
- Editado valeriasheredia martes, 10 de octubre de 2017 4:23
Respuestas
-
Si haces un INNER JOIN entonces perderas los rangos que no contemplen atletas, para lo cual deberas usar un OUTER JOIN (RIGHT en este caso).
SELECT dbo.Atleta_X_Competencia.Id_Competencia, dbo.Competencia.Nombre_Competencia, dbo.Competencia.Lugar_Competencia, dbo.Competencia.Distancia, dbo.Competencia.Fecha_Inicio, dbo.Competencia.Hora_Inicio, dbo.Provincia.Nombre_Provincia, dbo.Localidad.Nombre_Localidad, dbo.Atleta_X_Competencia.Id_Atleta, dbo.Atleta.Nombre_Atleta, dbo.Atleta.Apellido_Atleta, DATEDIFF(YEAR, dbo.Atleta.Fecha_Nacimiento, GETDATE()) AS Edad, dbo.Sexo.Sexo, dbo.Atleta.Otra_Institución, dbo.Atleta_X_Competencia.Id_Resultados_X_Competencia, dbo.Resultados_X_Competencia.Mejor, dbo.Resultados_X_Competencia.Posicion, dbo.Juez.Apellido_Juez, dbo.Resultados_X_Competencia.Dorsal, T.t3 AS RangoEdades FROM dbo.Atleta INNER JOIN dbo.Atleta_X_Competencia ON dbo.Atleta.Id_Atleta = dbo.Atleta_X_Competencia.Id_Atleta INNER JOIN dbo.Competencia ON dbo.Atleta_X_Competencia.Id_Competencia = dbo.Competencia.Id_Competencia INNER JOIN dbo.Sexo ON dbo.Atleta.Id_Sexo = dbo.Sexo.Id_sexo INNER JOIN dbo.Resultados_X_Competencia ON dbo.Atleta_X_Competencia.Id_Resultados_X_Competencia = dbo.Resultados_X_Competencia.Id_Resultados_X_Competencia INNER JOIN dbo.Localidad ON dbo.Competencia.Id_Localidad = dbo.Localidad.Id_Localidad INNER JOIN dbo.Provincia ON dbo.Provincia.Id_Provincia = dbo.Competencia.Id_Provincia INNER JOIN Juez ON juez.Id_Juez = Resultados_X_Competencia.Id_Juez RIGHT OUTER JOIN ( VALUES ( 10, 15, 'De 10 a 15 años' ), ( 16 , 20 , 'De 16 a 20 años' ), ( 21 , 25 , 'De 21 a 25 años' ), ( 26 , 30 , 'De 26 a 30 años' ), ( 31 , 35 , 'De 31 a 35 años' ), ( 36 , 40 , 'De 36 a 40 años' ), ( 31 , 35 , 'De 41 a 45 años' ), ( 36 , 40 , 'De 46 a 50 años' ), ( 31 , 35 , 'De 51 a 55 años' ), ( 36 , 40 , 'De 56 a 60 años' ), ( 31 , 35 , 'De 61 a 65 años' ), ( 31 , 35 , 'De 66 a 70 años' ), ( 31 , 35 , 'De 71 a 75 años' ), ( 36 , 40 , 'De 76 a 80 años' ), ( 31 , 35 , 'De 81 a 85 años' ), ( 36 , 40 , 'De 86 a 90 años' ), ( 31 , 35 , 'De 91 a 95 años' ), ( 36 , 40 , 'De 96 a 100 años' ) ) AS T (t1, t2, t3) ON CONVERT(int, DATEDIFF(d, atleta.Fecha_Nacimiento, GETDATE()) / 365.25) BETWEEN T.t1 AND T.t2 WHERE Atleta_X_Competencia.Id_Competencia = ( SELECT MAX(Id_Competencia) FROM Competencia ) ORDER BY T.t1, dbo.Atleta.Id_Sexo, dbo.Resultados_X_Competencia.Posicion -- no se donde esta el tiempo al que te refieres en tus comentarios ;
AMB
Some guidelines for posting questions...
AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas- Propuesto como respuesta Juan MondragónModerator martes, 10 de octubre de 2017 16:19
- Marcado como respuesta valeriasheredia miércoles, 11 de octubre de 2017 15:28
-
Valeria,
En el query que sugeri anteriormente cambia la clausula ORDER BY como se indica aqui:
... ORDER BY dbo.Atleta.Id_Sexo, T.t1, dbo.Resultados_X_Competencia.Mejor;
AMB
Some guidelines for posting questions...
AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas- Marcado como respuesta valeriasheredia miércoles, 11 de octubre de 2017 15:21
Todas las respuestas
-
Si haces un INNER JOIN entonces perderas los rangos que no contemplen atletas, para lo cual deberas usar un OUTER JOIN (RIGHT en este caso).
SELECT dbo.Atleta_X_Competencia.Id_Competencia, dbo.Competencia.Nombre_Competencia, dbo.Competencia.Lugar_Competencia, dbo.Competencia.Distancia, dbo.Competencia.Fecha_Inicio, dbo.Competencia.Hora_Inicio, dbo.Provincia.Nombre_Provincia, dbo.Localidad.Nombre_Localidad, dbo.Atleta_X_Competencia.Id_Atleta, dbo.Atleta.Nombre_Atleta, dbo.Atleta.Apellido_Atleta, DATEDIFF(YEAR, dbo.Atleta.Fecha_Nacimiento, GETDATE()) AS Edad, dbo.Sexo.Sexo, dbo.Atleta.Otra_Institución, dbo.Atleta_X_Competencia.Id_Resultados_X_Competencia, dbo.Resultados_X_Competencia.Mejor, dbo.Resultados_X_Competencia.Posicion, dbo.Juez.Apellido_Juez, dbo.Resultados_X_Competencia.Dorsal, T.t3 AS RangoEdades FROM dbo.Atleta INNER JOIN dbo.Atleta_X_Competencia ON dbo.Atleta.Id_Atleta = dbo.Atleta_X_Competencia.Id_Atleta INNER JOIN dbo.Competencia ON dbo.Atleta_X_Competencia.Id_Competencia = dbo.Competencia.Id_Competencia INNER JOIN dbo.Sexo ON dbo.Atleta.Id_Sexo = dbo.Sexo.Id_sexo INNER JOIN dbo.Resultados_X_Competencia ON dbo.Atleta_X_Competencia.Id_Resultados_X_Competencia = dbo.Resultados_X_Competencia.Id_Resultados_X_Competencia INNER JOIN dbo.Localidad ON dbo.Competencia.Id_Localidad = dbo.Localidad.Id_Localidad INNER JOIN dbo.Provincia ON dbo.Provincia.Id_Provincia = dbo.Competencia.Id_Provincia INNER JOIN Juez ON juez.Id_Juez = Resultados_X_Competencia.Id_Juez RIGHT OUTER JOIN ( VALUES ( 10, 15, 'De 10 a 15 años' ), ( 16 , 20 , 'De 16 a 20 años' ), ( 21 , 25 , 'De 21 a 25 años' ), ( 26 , 30 , 'De 26 a 30 años' ), ( 31 , 35 , 'De 31 a 35 años' ), ( 36 , 40 , 'De 36 a 40 años' ), ( 31 , 35 , 'De 41 a 45 años' ), ( 36 , 40 , 'De 46 a 50 años' ), ( 31 , 35 , 'De 51 a 55 años' ), ( 36 , 40 , 'De 56 a 60 años' ), ( 31 , 35 , 'De 61 a 65 años' ), ( 31 , 35 , 'De 66 a 70 años' ), ( 31 , 35 , 'De 71 a 75 años' ), ( 36 , 40 , 'De 76 a 80 años' ), ( 31 , 35 , 'De 81 a 85 años' ), ( 36 , 40 , 'De 86 a 90 años' ), ( 31 , 35 , 'De 91 a 95 años' ), ( 36 , 40 , 'De 96 a 100 años' ) ) AS T (t1, t2, t3) ON CONVERT(int, DATEDIFF(d, atleta.Fecha_Nacimiento, GETDATE()) / 365.25) BETWEEN T.t1 AND T.t2 WHERE Atleta_X_Competencia.Id_Competencia = ( SELECT MAX(Id_Competencia) FROM Competencia ) ORDER BY T.t1, dbo.Atleta.Id_Sexo, dbo.Resultados_X_Competencia.Posicion -- no se donde esta el tiempo al que te refieres en tus comentarios ;
AMB
Some guidelines for posting questions...
AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas- Propuesto como respuesta Juan MondragónModerator martes, 10 de octubre de 2017 16:19
- Marcado como respuesta valeriasheredia miércoles, 11 de octubre de 2017 15:28
-
hunchback buenas tardes!! gracias por tu respuesta..
he explicado muy superficialmente mi procedimiento perdon..
este procedimiento que hice muestra el listado de los atletas que han participado en una competencia (dorsal, apellido...., tiempo, posicion....), ademas de tener los datos de la competencia.
Este listado es "general", con esto quiero decir que en una competencia o maraton xxxx participan todos los que se inscribieron (hombres y mujeres de todas las edades). A este procedimiento lo ultilizo para un reporte en visual basic.
desearia por un lado que este mismo listado de atletas se pueda ordenar por rangos de edades y sexo (por ejemplo como decia arriba..mujeres de 20-29....hombres de 20-29....etc)
por otro lado desearia que cada rango de edades a su vez esten ordenados por tiempo(al campo lo llamo "Mejor"). El tiempo es un campo de una tabla que representa justamente el tiempo que tardo el atleta en llegar a la meta.
"mujeres de 20-29"
dorsal apellido tiempo posicion
1 a 01:00:00 1
2 b 01:00:01 2
3 c 01:00:02 3
..............................
"hombres de 20-29"
dorsal apellido tiempo posicion
1 a 01:01:00 1
2 b 01:01:01 2
3 c 01:01:02 3
................................
esto es mas o menos lo que quisiera que se mostrara en mi procedimiento que va a servir para mostrar otro reporte. Creo que lo que faltaria es poder ordenar cada rango por tiempo...
nuevamente agradecerles la atencion..saludos!!!
valeria heredia
- Editado valeriasheredia martes, 10 de octubre de 2017 20:07
-
Valeria,
En el query que sugeri anteriormente cambia la clausula ORDER BY como se indica aqui:
... ORDER BY dbo.Atleta.Id_Sexo, T.t1, dbo.Resultados_X_Competencia.Mejor;
AMB
Some guidelines for posting questions...
AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas- Marcado como respuesta valeriasheredia miércoles, 11 de octubre de 2017 15:21