none
BUSCAR VALOR MAYOR ENTRE DOS FECHAS RRS feed

  • Pregunta

  • Tabla Matricula

    Num_Estudiante       Curso         Termino

            11                     6                1701

            11                     6                1902

            11                     6                1905

    Tabla Terminos

    Termino    Fecha_Fin       Fecha_Fin_2

       1701      05/05/2018     07/05/2018

       1902      06/01/2019

       1905      07/07/2019     07/22/2019

    el estudiante 11 estuvo matriculado en el curso 6 en tres terminos distintos 1701,1902,1905 necesito una consulta para saber cual es la fecha mayor en la que el estudiante 11 estuvo matriculado a base de las fechas Fecha_Fin y Fecha_Fin_2 de la Tabla terminos que se supone que en este caso sea 07/22/2019, mi problema es que como tengo que comparar de dos columnas no se como hacerlo y en la consulta solo me puede salir un valor agrupado trate con max() pero no puedo agrupar como quiero, gracias, la consulta debe salir

    Num_Estudiante      Fecha

             11                 07/22/2019

    miércoles, 13 de noviembre de 2019 14:37

Respuestas

  • Hola Efrain Diaz:

    create table tabla_MatricuLa(Num_Estudiante int, Curso int, Termino int)
    Create table tabla_Terminos (Termino int, Fecha_fin date, Fecha_fin_2 date)
    go
    insert into tabla_Matricula (Num_Estudiante, Curso,Termino)
    values
    (11,6,1701),
    (11,6,1902),
    (11,6,1905);
    go
    insert into tabla_Terminos (Termino, Fecha_fin, Fecha_fin_2)
    values
    (1701,'20180505','20180705'),
    (1902,'20190601',null),
    (1905,'20190707','20190722');
    GO
    
    
    SELECT Num_Estudiante
    	 , MAX(CASE
    		WHEN isnull(X.Fecha_fin,'19000101') > isnull(X.FECHA_FIN_2,'19000101') THEN X.FECHA_FIN
    		   ELSE X.FECHA_FIN_2
    		   END) AS FECHA
    	   FROM tabla_MatricuLa T
    			INNER JOIN tabla_Terminos X ON T.Termino = X.Termino
    	   GROUP BY Num_Estudiante;

    Siempre puedes utilizar un case, para que solo devuelva el mayor valor de los dos.

    Salida

    • Propuesto como respuesta Pablo RubioModerator miércoles, 13 de noviembre de 2019 18:20
    • Marcado como respuesta Efrain Diaz jueves, 14 de noviembre de 2019 13:04
    miércoles, 13 de noviembre de 2019 16:07
  • Además de la solución propuesta por Javier, he aquí otra solución pero utilizando UNPIVOT:

    -- código #1
    with Leitura as (
    SELECT M.Num_Estudiante, M.Curso, T.Fecha_Fin, T.Fecha_Fin_2
      from Matricula as M
           inner join Terminos as T on T.Termino = M.Termino
    )
    SELECT Num_Estudiante, Curso, max (Fecha) as Fecha
      from Leitura
           unpivot (Fecha for Origen in ([Fecha_Fin], [Fecha_Fin_2])) as N
      group by Num_Estudiante, Curso;


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Marcado como respuesta Efrain Diaz jueves, 14 de noviembre de 2019 13:04
    • Editado José Diz jueves, 14 de noviembre de 2019 17:43
    jueves, 14 de noviembre de 2019 0:23

Todas las respuestas

  • Hola Efrain Diaz:

    create table tabla_MatricuLa(Num_Estudiante int, Curso int, Termino int)
    Create table tabla_Terminos (Termino int, Fecha_fin date, Fecha_fin_2 date)
    go
    insert into tabla_Matricula (Num_Estudiante, Curso,Termino)
    values
    (11,6,1701),
    (11,6,1902),
    (11,6,1905);
    go
    insert into tabla_Terminos (Termino, Fecha_fin, Fecha_fin_2)
    values
    (1701,'20180505','20180705'),
    (1902,'20190601',null),
    (1905,'20190707','20190722');
    GO
    
    
    SELECT Num_Estudiante
    	 , MAX(CASE
    		WHEN isnull(X.Fecha_fin,'19000101') > isnull(X.FECHA_FIN_2,'19000101') THEN X.FECHA_FIN
    		   ELSE X.FECHA_FIN_2
    		   END) AS FECHA
    	   FROM tabla_MatricuLa T
    			INNER JOIN tabla_Terminos X ON T.Termino = X.Termino
    	   GROUP BY Num_Estudiante;

    Siempre puedes utilizar un case, para que solo devuelva el mayor valor de los dos.

    Salida

    • Propuesto como respuesta Pablo RubioModerator miércoles, 13 de noviembre de 2019 18:20
    • Marcado como respuesta Efrain Diaz jueves, 14 de noviembre de 2019 13:04
    miércoles, 13 de noviembre de 2019 16:07
  • Además de la solución propuesta por Javier, he aquí otra solución pero utilizando UNPIVOT:

    -- código #1
    with Leitura as (
    SELECT M.Num_Estudiante, M.Curso, T.Fecha_Fin, T.Fecha_Fin_2
      from Matricula as M
           inner join Terminos as T on T.Termino = M.Termino
    )
    SELECT Num_Estudiante, Curso, max (Fecha) as Fecha
      from Leitura
           unpivot (Fecha for Origen in ([Fecha_Fin], [Fecha_Fin_2])) as N
      group by Num_Estudiante, Curso;


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Marcado como respuesta Efrain Diaz jueves, 14 de noviembre de 2019 13:04
    • Editado José Diz jueves, 14 de noviembre de 2019 17:43
    jueves, 14 de noviembre de 2019 0:23