none
Obtener el registro con la fecha mas reciente RRS feed

  • Pregunta

  • Buenas tardes, estoy haciendo una consulta en donde me salen varios registros pero necesito que solo me salga el ultimo de cada folio, les muestro mi código

    SELECT T0.[Folio], T0.[CCode], T1.[CName],  T2.[SName], T6.[PName],  T0.[WtSys],  T0.[MaxSys], T0.[CloPrcnt],  
    T0.[ODate] Inicio,  Month(T0.[ODate]) MesInicio,  Year(T0.[ODate]) YearInicio ,  T0.[Status],
    T3.[Num], T3.[Descript] UltimaE,  T5.[Descript] Etapa,  T4.[ODate] Inicio,  Month(T4.[ODate]) MesInicio,
    Year(T4.[ODate]) AñoInicio,  T4.[CDate] Cierre, Month(T4.[CDate]) MesCierre,  Year(T4.[CDate]) AñoCierre
    
    FROM OOPR T0 
    LEFT JOIN OCRD T1 ON T0.CCode = T1.CCode
    LEFT JOIN OSLP T2 ON T0.SCode = T2.SCode 
    LEFT JOIN OOST T3 ON T0.StepLast = T3.Num 
    LEFT JOIN OPR1 T4 ON T0.[Folio] = T4.[Folio] 
    LEFT JOIN OOST T5 ON T4.Step_Id = T5.Num 
    LEFT JOIN OPRJ T6 ON T0.PrjCode = T6.PrjCode 

    y un ejemplo de que es lo que hace no puse todos los campos, pero yo quisiera que solo me mostrara lo que esta en amarillo ya que lo otros valores no me interesan trate por medio de la etapa que me trajera la ultima pero como hay duplicados no me sirve y por fecha no logro hacerlo.

    




    • Editado Louisa_E viernes, 17 de abril de 2020 17:28
    viernes, 17 de abril de 2020 17:27

Respuestas

  • Hola Nancy F:

    ;WITH CTE AS (
    -- AQUÍ DENTRO TU SELECT ....
    SELECT * FROM (VALUES 
    (1,'CO13','CLIENTE Q','A','VNT1',10,'20201601',1,2020,'ABIERTA',1),
    (1,'CO13','CLIENTE Q','A','VNT1',10,'20201701',1,2020,'ABIERTA',2),
    (1,'CO13','CLIENTE Q','A','VNT1',20,'20202001',1,2020,'ABIERTA',3),
    (2,'CO14','CLIENTE c','B','VNT2',50,'20200302',3,2020,'PERDIDOA',1),
    (2,'CO14','CLIENTE c','B','VNT2',50,'20200303',3,2020,'PERDIDOA',2),
    (2,'CO14','CLIENTE c','B','VNT2',60,'20200304',3,2020,'PERDIDOA',3),
    (2,'CO14','CLIENTE c','B','VNT2',50,'20200420',3,2020,'PERDIDOA',3),
    (2,'CO14','CLIENTE c','B','VNT2',60,'20200820',3,2020,'PERDIDOA',4),
    (3,'CO15','CLIENTE A','C','VNT3',10,'20200405',4,2020,'ABIERTA',1),
    (3,'CO15','CLIENTE A','C','VNT3',30,'20200415',4,2020,'ABIERTA',2),
    (3,'CO15','CLIENTE A','C','VNT3',70,'20200418',4,2020,'ABIERTA',3)
    )
    T(FOLIO, CODE, NAME, VENDEDOR, PROYECTO,PORCENTAJE, INICIO, MES, AÑO, ESTADO, ETAPA)
    --- FIN DE TU SELECT
    ), MAXIMOS AS (
    SELECT C.FOLIO, MAX(C.INICIO) AS INICIO FROM CTE C 
    GROUP BY C.FOLIO
    )
    SELECT c.* FROM MAXIMOS M INNER JOIN CTE C
    ON M.INICIO = C.INICIO AND M.FOLIO = C.FOLIO

    Como no dispongo de tus datos ni estructura, los he simulado en construyendo una tabla en el propio código.

    Constructor con valores de tabla

    https://javifer2.wordpress.com/2020/04/05/arrays-en-sql-server-constructor-con-valores-de-tabla/

    Por tanto en la primera tabla de expresión común, dentro de los paréntesis, pegas tu Select quitando la mía.

    En el segundo conjunto "maximos" obtienes la mayor fecha de cada folio. Puedes también sustituirlo por el operador top.

    Y en la salida, se mezclan ambos conjuntos para obtener una sola fila, por cada folio.

    Tablas de expresión comúnhttps://javifer2.wordpress.com/2018/12/18/with-cte-tablas-de-expresion-comun-1/

    Por tanto tu query sería así:

    ;WITH CTE AS (
    -- AQUÍ DENTRO TU SELECT ....
    SELECT T0.Folio
    	 , T0.CCode
    	 , T1.CName
    	 , T2.SName
    	 , T6.PName
    	 , T0.WtSys
    	 , T0.MaxSys
    	 , T0.CloPrcnt
    	 , T0.ODate Inicio
    	 , Month(T0.ODate) MesInicio
    	 , Year(T0.ODate) YearInicio
    	 , T0.Status
    	 , T3.Num
    	 , T3.Descript UltimaE
    	 , T5.Descript Etapa
    	 , T4.ODate Inicio
    	 , Month(T4.ODate) MesInicio
    	 , Year(T4.ODate) AñoInicio
    	 , T4.CDate Cierre
    	 , Month(T4.CDate) MesCierre
    	 , Year(T4.CDate) AñoCierre
    	   FROM OOPR T0
    				 LEFT JOIN OCRD T1 ON T0.CCode = T1.CCode
    				 LEFT JOIN OSLP T2 ON T0.SCode = T2.SCode
    				 LEFT JOIN OOST T3 ON T0.StepLast = T3.Num
    				 LEFT JOIN OPR1 T4 ON T0.Folio = T4.Folio
    				 LEFT JOIN OOST T5 ON T4.Step_Id = T5.Num
    				 LEFT JOIN OPRJ T6 ON T0.PrjCode = T6.PrjCode
    --- FIN DE TU SELECT
    ), MAXIMOS AS (
    SELECT C.FOLIO, MAX(C.INICIO) AS INICIO FROM CTE C 
    GROUP BY C.FOLIO
    )
    SELECT c.* FROM MAXIMOS M INNER JOIN CTE C
    ON M.INICIO = C.INICIO AND M.FOLIO = C.FOLIO


    • Editado Javi Fernández F sábado, 18 de abril de 2020 9:16
    • Marcado como respuesta Louisa_E miércoles, 17 de junio de 2020 22:47
    sábado, 18 de abril de 2020 9:15

Todas las respuestas

  • Hola Louisa_E:

    Suponiendo que la columna t0.ODate sea una fecha

    SELECT T0.Folio
    	 , T0.CCode
    	 , T1.CName
    	 , T2.SName
    	 , T6.PName
    	 , T0.WtSys
    	 , T0.MaxSys
    	 , T0.CloPrcnt
    	 , T0.ODate Inicio
    	 , Month(T0.ODate) MesInicio
    	 , Year(T0.ODate) YearInicio
    	 , T0.Status
    	 , T3.Num
    	 , T3.Descript UltimaE
    	 , T5.Descript Etapa
    	 , T4.ODate Inicio
    	 , Month(T4.ODate) MesInicio
    	 , Year(T4.ODate) AñoInicio
    	 , T4.CDate Cierre
    	 , Month(T4.CDate) MesCierre
    	 , Year(T4.CDate) AñoCierre
    	   FROM OOPR T0
    				 LEFT JOIN OCRD T1 ON T0.CCode = T1.CCode
    				 LEFT JOIN OSLP T2 ON T0.SCode = T2.SCode
    				 LEFT JOIN OOST T3 ON T0.StepLast = T3.Num
    				 LEFT JOIN OPR1 T4 ON T0.Folio = T4.Folio
    				 LEFT JOIN OOST T5 ON T4.Step_Id = T5.Num
    				 LEFT JOIN OPRJ T6 ON T0.PrjCode = T6.PrjCode
    		INNER JOIN (
    			SELECT MAX(ODATE) FECHA, A.FOLIO
    			FROM OOPR A
    
    			GROUP BY A.FOLIO
    		) AS MAXFECHA ON MAXFECHA.FECHA = T0.ODate AND MAXFECHA.FOLIO = T0.FOLIO

    Haces una tabla derivada con las fechas y los folios agrupados, y relacionas la tabla derivada con tu tabla OOPR.

    Otra opción es utilizar el operador apply

    SELECT T0.Folio
    	 , T0.CCode
    	 , T1.CName
    	 , T2.SName
    	 , T6.PName
    	 , T0.WtSys
    	 , T0.MaxSys
    	 , T0.CloPrcnt
    	 , T0.ODate Inicio
    	 , Month(T0.ODate) MesInicio
    	 , Year(T0.ODate) YearInicio
    	 , T0.Status
    	 , T3.Num
    	 , T3.Descript UltimaE
    	 , T5.Descript Etapa
    	 , T4.ODate Inicio
    	 , Month(T4.ODate) MesInicio
    	 , Year(T4.ODate) AñoInicio
    	 , T4.CDate Cierre
    	 , Month(T4.CDate) MesCierre
    	 , Year(T4.CDate) AñoCierre
    	   FROM OOPR T0
    				 LEFT JOIN OCRD T1 ON T0.CCode = T1.CCode
    				 LEFT JOIN OSLP T2 ON T0.SCode = T2.SCode
    				 LEFT JOIN OOST T3 ON T0.StepLast = T3.Num
    				 LEFT JOIN OPR1 T4 ON T0.Folio = T4.Folio
    				 LEFT JOIN OOST T5 ON T4.Step_Id = T5.Num
    				 LEFT JOIN OPRJ T6 ON T0.PrjCode = T6.PrjCode
    				 CROSS APPLY
    				 (
    				 SELECT MAX(ODATE) FECHA, A.FOLIO
    					FROM OOPR A
    					WHERE A.FOLIO = T0.FOLIO
    					GROUP BY A.FOLIO
    				 )AS MAXFECHA
    	WHERE MAXFECHA.FECHA = T0.ODATE

    viernes, 17 de abril de 2020 17:45
  • Realice las dos consultas, pero las dos me salen lo mismo y me sigue mostrando todos los valores .




    • Editado Louisa_E miércoles, 17 de junio de 2020 22:47
    viernes, 17 de abril de 2020 22:20
  • Hola Nancy F:

    ;WITH CTE AS (
    -- AQUÍ DENTRO TU SELECT ....
    SELECT * FROM (VALUES 
    (1,'CO13','CLIENTE Q','A','VNT1',10,'20201601',1,2020,'ABIERTA',1),
    (1,'CO13','CLIENTE Q','A','VNT1',10,'20201701',1,2020,'ABIERTA',2),
    (1,'CO13','CLIENTE Q','A','VNT1',20,'20202001',1,2020,'ABIERTA',3),
    (2,'CO14','CLIENTE c','B','VNT2',50,'20200302',3,2020,'PERDIDOA',1),
    (2,'CO14','CLIENTE c','B','VNT2',50,'20200303',3,2020,'PERDIDOA',2),
    (2,'CO14','CLIENTE c','B','VNT2',60,'20200304',3,2020,'PERDIDOA',3),
    (2,'CO14','CLIENTE c','B','VNT2',50,'20200420',3,2020,'PERDIDOA',3),
    (2,'CO14','CLIENTE c','B','VNT2',60,'20200820',3,2020,'PERDIDOA',4),
    (3,'CO15','CLIENTE A','C','VNT3',10,'20200405',4,2020,'ABIERTA',1),
    (3,'CO15','CLIENTE A','C','VNT3',30,'20200415',4,2020,'ABIERTA',2),
    (3,'CO15','CLIENTE A','C','VNT3',70,'20200418',4,2020,'ABIERTA',3)
    )
    T(FOLIO, CODE, NAME, VENDEDOR, PROYECTO,PORCENTAJE, INICIO, MES, AÑO, ESTADO, ETAPA)
    --- FIN DE TU SELECT
    ), MAXIMOS AS (
    SELECT C.FOLIO, MAX(C.INICIO) AS INICIO FROM CTE C 
    GROUP BY C.FOLIO
    )
    SELECT c.* FROM MAXIMOS M INNER JOIN CTE C
    ON M.INICIO = C.INICIO AND M.FOLIO = C.FOLIO

    Como no dispongo de tus datos ni estructura, los he simulado en construyendo una tabla en el propio código.

    Constructor con valores de tabla

    https://javifer2.wordpress.com/2020/04/05/arrays-en-sql-server-constructor-con-valores-de-tabla/

    Por tanto en la primera tabla de expresión común, dentro de los paréntesis, pegas tu Select quitando la mía.

    En el segundo conjunto "maximos" obtienes la mayor fecha de cada folio. Puedes también sustituirlo por el operador top.

    Y en la salida, se mezclan ambos conjuntos para obtener una sola fila, por cada folio.

    Tablas de expresión comúnhttps://javifer2.wordpress.com/2018/12/18/with-cte-tablas-de-expresion-comun-1/

    Por tanto tu query sería así:

    ;WITH CTE AS (
    -- AQUÍ DENTRO TU SELECT ....
    SELECT T0.Folio
    	 , T0.CCode
    	 , T1.CName
    	 , T2.SName
    	 , T6.PName
    	 , T0.WtSys
    	 , T0.MaxSys
    	 , T0.CloPrcnt
    	 , T0.ODate Inicio
    	 , Month(T0.ODate) MesInicio
    	 , Year(T0.ODate) YearInicio
    	 , T0.Status
    	 , T3.Num
    	 , T3.Descript UltimaE
    	 , T5.Descript Etapa
    	 , T4.ODate Inicio
    	 , Month(T4.ODate) MesInicio
    	 , Year(T4.ODate) AñoInicio
    	 , T4.CDate Cierre
    	 , Month(T4.CDate) MesCierre
    	 , Year(T4.CDate) AñoCierre
    	   FROM OOPR T0
    				 LEFT JOIN OCRD T1 ON T0.CCode = T1.CCode
    				 LEFT JOIN OSLP T2 ON T0.SCode = T2.SCode
    				 LEFT JOIN OOST T3 ON T0.StepLast = T3.Num
    				 LEFT JOIN OPR1 T4 ON T0.Folio = T4.Folio
    				 LEFT JOIN OOST T5 ON T4.Step_Id = T5.Num
    				 LEFT JOIN OPRJ T6 ON T0.PrjCode = T6.PrjCode
    --- FIN DE TU SELECT
    ), MAXIMOS AS (
    SELECT C.FOLIO, MAX(C.INICIO) AS INICIO FROM CTE C 
    GROUP BY C.FOLIO
    )
    SELECT c.* FROM MAXIMOS M INNER JOIN CTE C
    ON M.INICIO = C.INICIO AND M.FOLIO = C.FOLIO


    • Editado Javi Fernández F sábado, 18 de abril de 2020 9:16
    • Marcado como respuesta Louisa_E miércoles, 17 de junio de 2020 22:47
    sábado, 18 de abril de 2020 9:15
  • Hola Louisa_E

     

    ¿Alguna actualización sobre la consulta realizada? ¿Alguna de las respuestas proporcionadas te ayudó?

     

    Espero tu respuesta.

     

    Gracias por usar los foros de MSDN.

     

     

    Luis Diego Mora

     

    --------------------------------------------------------------------------

     

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde. 

     

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.  

     

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.

    viernes, 24 de abril de 2020 17:52
    Moderador