none
crear procedimiento almacendo con rango de edades RRS feed

  • Pregunta

  • buenas tardes! recurro de nuevo a uds ya que necesito agregar un campo a mi tabla 'planillacalle' que se llame Categoria, la cual se define de acuerdo a un rango de edad de esta manera:

     de 10 a 11 años= preinfantil

    de 11 a 12 años = infantil

    de 12 a 14 años=cadetes

    de 14 a 17 años= menor

    de 15 a 19 años=juvenil

    de 16 en adelante= mayor

    como ven algunas edades de superponen lo que significa que por ejemplo que una atleta de 16 años es de categoria menor! pero puede pasar que en una competencia cualquiera pueda participar como juvenil o como mayor...

    es asi como se muestra a continuacion como yo calculo la edad del atleta:

    SELECT     dbo.Atleta.Nombre_Atleta, dbo.Atleta.Id_Atleta, dbo.Atleta.Apellido_Atleta,
    dbo.Atleta.Fecha_Nacimiento, DATEDIFF (year,dbo.Atleta.Fecha_Nacimiento, GETDATE()) as edad
    FROM         dbo.Atleta

            
            if OBJECT_ID ('planillacalle') is not null
           drop proc planillacalle
           go
           create proc planillacalle
           as
           select   dbo.Atleta.Dorsal,dbo.Atleta.Nombre_Atleta,dbo.Atleta.Apellido_Atleta,
            DATEDIFF (year,dbo.Atleta.Fecha_Nacimiento, GETDATE()) as Edad,
             Sexo.Sexo, Club_Federación.Nombre_Club
           FROM Atleta
          inner join Sexo
          on Sexo.Id_sexo=Atleta.Id_Sexo
          inner join Club_Federación
          on Club_Federación.Id_Club_Federación=Atleta.Id_Club_Federación
           GO

    la idea es que de acuerdo a la edad del atleta me muestre  la categoria y me permita que pueda participar en las otras categorias de la competencia.

    esto es dificil para mi!! espero puedan ayudarme..nuevamente muchas gracias!!


    valeria heredia

    domingo, 19 de febrero de 2017 13:57

Respuestas

  • valeriasheredia,

    Entiendo, para el caso que requieres creo que lo conveniente será crear una vista y no un procedimiento almacenado, la idea es consultar contra la vista las categorías por atleta o consultar si determinado atleta está preparado para participar en una determinada categoría:

    CREATE VIEW dbo.planillacalle
    AS
        SELECT   
    	   a.Dorsal,
    	   a.Nombre_Atleta,
    	   a.Apellido_Atleta,	   
    	   s.Sexo, 
    	   c.Nombre_Club,	   
    	   CONVERT(int, DATEDIFF(d, a.Fecha_Nacimiento, GETDATE())/365.25) AS Edad,
    	   t.t3 AS [CATEGORIA]
        FROM 
    	   Atleta a
    	   INNER JOIN Sexo s ON s.Id_sexo = a.Id_Sexo
    	   INNER JOIN Club_Federación c on c.Id_Club_Federación = a.Id_Club_Federación
    	   INNER JOIN (VALUES 
    				(10, 11, 'PRE-INFANTIL'),
    				(11, 12, 'INFANTIL'),
    				(12, 14, 'CADETES'),
    				(14, 17, 'MENOR'),
    				(15, 19, 'JUVENIL'),
    				(16, 100, 'MAYOR')) AS T (t1, t2, t3) 
    		  ON CONVERT(int, DATEDIFF(d, a.Fecha_Nacimiento, GETDATE())/365.25)
    				BETWEEN T.t1 AND T.t2
    GO

    Por ejemplo, ¿el atleta Juan Molina puede participar en la categoría CADETES?

    SELECT * FROM dbo.planillacalle 
    WHERE a.Nombre_Atleta = @Nombre AND a.CATEGORIA = @Categoria;


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    domingo, 19 de febrero de 2017 17:54
  • valeriasheredia,

    La manera como calculas la edad no es exacta porque no discriminas los meses ni días, te recomiendo cambiar de expresión a la siguiente:

    SELECT CONVERT(int, DATEDIFF(d, a.Fecha_Nacimiento, GETDATE())/365.25)

    Por otro lado, no dejas claro como deseas recuperar los datos respecto a las posibles categorías del atleta, ¿cómo filas? ¿cómo columnas?

    La siguiente consulta retorna cada atleta con las posibles categorías en la que puede participar (como filas)

    CREATE PROCEDURE dbo.planillacalle
    AS
    BEGIN
        SELECT   
    	   a.Dorsal,
    	   a.Nombre_Atleta,
    	   a.Apellido_Atleta,	   
    	   s.Sexo, 
    	   c.Nombre_Club,	   
    	   CONVERT(int, DATEDIFF(d, a.Fecha_Nacimiento, GETDATE())/365.25) AS Edad,
    	   t.t3 AS [CATEGORIA]
        FROM 
    	   Atleta a
    	   INNER JOIN Sexo s ON s.Id_sexo = a.Id_Sexo
    	   INNER JOIN Club_Federación c on c.Id_Club_Federación = a.Id_Club_Federación
    	   INNER JOIN (VALUES 
    				(10, 11, 'PRE-INFANTIL'),
    				(11, 12, 'INFANTIL'),
    				(12, 14, 'CADETES'),
    				(14, 17, 'MENOR'),
    				(15, 19, 'JUVENIL'),
    				(16, 100, 'MAYOR')) AS T (t1, t2, t3) 
    		  ON CONVERT(int, DATEDIFF(d, a.Fecha_Nacimiento, GETDATE())/365.25)
    				BETWEEN T.t1 AND T.t2
    END
    GO


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta valeriasheredia martes, 10 de octubre de 2017 19:56
    domingo, 19 de febrero de 2017 15:32

Todas las respuestas

  • valeriasheredia,

    La manera como calculas la edad no es exacta porque no discriminas los meses ni días, te recomiendo cambiar de expresión a la siguiente:

    SELECT CONVERT(int, DATEDIFF(d, a.Fecha_Nacimiento, GETDATE())/365.25)

    Por otro lado, no dejas claro como deseas recuperar los datos respecto a las posibles categorías del atleta, ¿cómo filas? ¿cómo columnas?

    La siguiente consulta retorna cada atleta con las posibles categorías en la que puede participar (como filas)

    CREATE PROCEDURE dbo.planillacalle
    AS
    BEGIN
        SELECT   
    	   a.Dorsal,
    	   a.Nombre_Atleta,
    	   a.Apellido_Atleta,	   
    	   s.Sexo, 
    	   c.Nombre_Club,	   
    	   CONVERT(int, DATEDIFF(d, a.Fecha_Nacimiento, GETDATE())/365.25) AS Edad,
    	   t.t3 AS [CATEGORIA]
        FROM 
    	   Atleta a
    	   INNER JOIN Sexo s ON s.Id_sexo = a.Id_Sexo
    	   INNER JOIN Club_Federación c on c.Id_Club_Federación = a.Id_Club_Federación
    	   INNER JOIN (VALUES 
    				(10, 11, 'PRE-INFANTIL'),
    				(11, 12, 'INFANTIL'),
    				(12, 14, 'CADETES'),
    				(14, 17, 'MENOR'),
    				(15, 19, 'JUVENIL'),
    				(16, 100, 'MAYOR')) AS T (t1, t2, t3) 
    		  ON CONVERT(int, DATEDIFF(d, a.Fecha_Nacimiento, GETDATE())/365.25)
    				BETWEEN T.t1 AND T.t2
    END
    GO


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta valeriasheredia martes, 10 de octubre de 2017 19:56
    domingo, 19 de febrero de 2017 15:32
  • Que grande que sos Williams!!  hasta me has ayudado a ordenar mis ideas!!

    lo que viene ahora es mas codigo en visual basic 2010 ,es decir, que cuando yo creo una competencia de salto por ejemplo, de categoria 'preinfantil', que se valide segun la edad del atleta su participacion o no a la competencia. (en la crecion de la competencia yo tengo un combobox con las categorias, al ir ingresando atletas a la competencia el sistema tiene que hacer la validacion segun su edad, que permita o no el ingreso)

    por ejemplo:un atleta de 15 años puede participar de competencias en donde las categorias pueden ser menor, juvenil o mayor

    pero no en categorias menores(cadetes, infantiles, pre-infantiles)

    de 10 a 11 años= preinfantil

    de 11 a 12 años = infantil

    de 12 a 14 años=cadetes

    de 14 a 17 años= menor

    de 15 a 19 años=juvenil

    de 16 en adelante= mayor

    tome tu recomendacion del calculo de la edad!! si puedes ayudarme en ésta te agradezco infinitamente!!!


    valeria heredia

    domingo, 19 de febrero de 2017 17:31
  • valeriasheredia,

    Entiendo, para el caso que requieres creo que lo conveniente será crear una vista y no un procedimiento almacenado, la idea es consultar contra la vista las categorías por atleta o consultar si determinado atleta está preparado para participar en una determinada categoría:

    CREATE VIEW dbo.planillacalle
    AS
        SELECT   
    	   a.Dorsal,
    	   a.Nombre_Atleta,
    	   a.Apellido_Atleta,	   
    	   s.Sexo, 
    	   c.Nombre_Club,	   
    	   CONVERT(int, DATEDIFF(d, a.Fecha_Nacimiento, GETDATE())/365.25) AS Edad,
    	   t.t3 AS [CATEGORIA]
        FROM 
    	   Atleta a
    	   INNER JOIN Sexo s ON s.Id_sexo = a.Id_Sexo
    	   INNER JOIN Club_Federación c on c.Id_Club_Federación = a.Id_Club_Federación
    	   INNER JOIN (VALUES 
    				(10, 11, 'PRE-INFANTIL'),
    				(11, 12, 'INFANTIL'),
    				(12, 14, 'CADETES'),
    				(14, 17, 'MENOR'),
    				(15, 19, 'JUVENIL'),
    				(16, 100, 'MAYOR')) AS T (t1, t2, t3) 
    		  ON CONVERT(int, DATEDIFF(d, a.Fecha_Nacimiento, GETDATE())/365.25)
    				BETWEEN T.t1 AND T.t2
    GO

    Por ejemplo, ¿el atleta Juan Molina puede participar en la categoría CADETES?

    SELECT * FROM dbo.planillacalle 
    WHERE a.Nombre_Atleta = @Nombre AND a.CATEGORIA = @Categoria;


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    domingo, 19 de febrero de 2017 17:54
  • muchas gracias por tu ayuda!!! es justo lo que necesitaba..

    valeria heredia

    lunes, 20 de febrero de 2017 3:05