none
agrupar y ordenar por grupo RRS feed

  • 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


    martes, 10 de octubre de 2017 4:22

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

    martes, 10 de octubre de 2017 14:10
  • 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
    miércoles, 11 de octubre de 2017 12:18

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

    martes, 10 de octubre de 2017 14:10
  • 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



    martes, 10 de octubre de 2017 19:49
  • 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
    miércoles, 11 de octubre de 2017 12:18