none
Sql de documentacion vigente RRS feed

  • Pregunta

  • Buenas Dias/Tardes,

    Quisiera hacer una consulta si ustedes me pueden ayudar necesito sacar los documentos que esten en la base de datos, estos deben estar en el caso que no se hayan actualizado en el sistema, es decir que mientras no exista otra fila con un nuevo documento debe mostrar el vencido.

    en este momento tengo este SQL

    SELECT adjuntovehiculo.tipo, adjuntovehiculo.numero, empresasadjunto.nombre, adjuntovehiculo.fExpedicion, adjuntovehiculo.fInicio, CURRENT_DATE , adjuntovehiculo.fSubida , adjuntovehiculo.fVencimiento, adjuntovehiculo.descripcion FROM adjuntovehiculo, empresasadjunto, vehiculo WHERE vehiculo.placa=adjuntovehiculo.placa AND empresasadjunto.idEmpresasAdjunto=adjuntovehiculo.idEmpresasAdjunto AND vehiculo.placa='SWN934' AND adjuntovehiculo.tipo IN ('LIC' ,'SOAT','TO') AND CURRENT_DATE<=adjuntovehiculo.fInicio AND adjuntovehiculo.fSubida =( SELECT MAX(adjuntovehiculo.fSubida) FROM adjuntovehiculo WHERE adjuntovehiculo.fSubida<=adjuntovehiculo.fVencimiento)

    Este permite sacar los documentos vigentes, pero debe ocultar los vencidos en el caso que exista una nueva fila "actualizando" el documento, en el caso que no exista debe permanecer el vencido.

    https://1drv.ms/u/s!As25II3XEXPYlBcwLYL3yDAqJ0H8

    viernes, 1 de febrero de 2019 0:37

Todas las respuestas

  • Hola GuilleDC:

    Supongo que tienes que exponer bastante más claro tu objetivo, porque no se te entiende. O al menos yo no

    • Lo primero, es que estas en un foro de SQL Server y esto no parece código de T-SQL (Current_Date). Es importante saber contra que motor te estás enfrentando, pues las soluciones son parecidas, pero diferentes.
    SELECT a.tipo, 
           a.numero, 
           e.nombre, 
           a.fExpedicion, 
           a.fInicio, 
           CURRENT_DATE, 
           a.fSubida, 
           a.fVencimiento, 
           a.descripcion
    FROM adjuntovehiculo a inner join empresasadjunto e 
    			on e.idEmpresasAdjunto = a.idEmpresasAdjunto,  
         inner join vehiculo v 
    			on v.placa = a.placa
    WHERE 
    	    v.placa = 'SWN934'
          AND a.tipo IN('LIC', 'SOAT', 'TO')
    AND CURRENT_DATE <= a.fInicio
    AND a.fSubida =
    (
        SELECT MAX(b.fSubida)
        FROM adjuntovehiculo b
        WHERE b.fSubida <= b.fVencimiento
    );

    ¿Una nueva fila actualizando el documento?

    • Propuesto como respuesta Pedro Alfaro viernes, 1 de febrero de 2019 15:28
    viernes, 1 de febrero de 2019 5:55
  • Gracias Javi si es me referia a CURRENT_DATE es SYSDATETIME,

    Entiendo que no fui claro, mira hay una tabla que guarda información de documentos

    //TIPO // NUMERO  // F_SUBIDA // F_INICIO   // F_VENCIMIENTO // PLACA //
    //LIC   // 1234          // 01-01-2019 // 01-01-2019 // 01-02-2019              // AAA000 //
    //SOAT// 56789      // 01-01-2019 // 01-01-2019 // 01-02-2019             // AAA000 //
    //LIC // 1121         // 02-02-2019 // 02-02-2019 // 01-03-2019             // AAA000 //


    La tabla guarda un histórico de todos los documentos que ha tenido un usuario (placa), es decir los documentos vencidos y los vigentes, necesito en una consulta sacar todos los documentos del usuario (tipo) pero que se encuentren vigentes, pero si el documento no se ha actualizado debe mostrar el anterior. es decir que el resultado de la consulta debe de salir así.

    //TIPO // NUMERO // F_SUBIDA // F_INICIO // F_VENCIMIENTO // PLACA //
    //SOAT// 56789 // 01-01-2019 // 01-01-2019 // 01-02-2019 // AAA000 //
    //LIC // 1121 // 02-02-2019 // 02-02-2019 // 01-03-2019 // AAA000 //

    Como el documento tipo 'SOAT' no se ha ingresado un nuevo registro con fechas mas actualizadas debe de permanecer el documento vencido, y en el caso de 'LIC' debe de aparecer el nuevo.

    Gracias



    • Editado GuilleDC sábado, 2 de febrero de 2019 8:37
    sábado, 2 de febrero de 2019 8:37
  • Hola GuilleDC:

    No has comentado tu versión de SQL. Si utilizas 2012 o superior, puedes usar la funcion lag para obtener el anterior.

    CREATE TABLE adjuntoVehiculo
    (TIPO          VARCHAR(4), 
     NUMERO        INT, 
     F_SUBIDA      DATE, 
     F_INICIO      DATE, 
     F_VENCIMIENTO DATE, 
     PLACA         VARCHAR(6)
    );
    GO
    insert into adjuntoVehiculo (tipo, NUMERO, F_SUBIDA , f_inicio, F_VENCIMIENTO, PLACA)
    values
    ('LIC',1234,'01-01-2019','01-01-2019','01-02-2019','AAA000'),
    ('SOAT', 56789 ,'01-01-2019','01-01-2019','01-02-2019','AAA000'),
    ('LIC',  1121,'02-02-2019','02-02-2019','01-03-2019','AAA000')
    go
    
    ;WITH cte
         AS (SELECT c.tipo,
                    MAX(C.F_VENCIMIENTO) AS MAXVTO,
                    c.PLACA
             FROM adjuntoVehiculo C
             GROUP BY C.TIPO,
                      C.PLACA)
         SELECT D.TIPO,
                C.NUMERO,
                C.F_SUBIDA,
                C.F_INICIO,
                D.MAXVTO AS F_VENCIMIENTO,
                C.PLACA
         FROM cte D
              JOIN adjuntoVehiculo C ON D.PLACA = C.PLACA
                                        AND D.TIPO = C.TIPO
                                        AND D.MAXVTO = C.F_VENCIMIENTO;

    A lo mejor me equivoco, pero dado que no importa la fecha del sistema, sino la ultima fecha de vencimiento, no es más fácil, preguntar por la ultima fecha, de cada conjunto por placa y tipo, y luego igualarlos a la salida del cte.

    Salida:

    Por cierto, si no es lo que buscas, indica el motor sql que estas usando, porque tambien a priori se pueden utilizar las funciones de ventana LAG o LEAD, y con ellas hacer alguna cosa y son superior a 2012.

    Cte=Tablas de expresión común:

    https://javifer2.wordpress.com/2018/12/18/with-cte-tablas-de-expresion-comun-1/

    • Propuesto como respuesta Pedro Alfaro lunes, 4 de febrero de 2019 16:18
    sábado, 2 de febrero de 2019 10:19
  • Adicional le pones una columna con algo asi y sabes quien esta fuera decobertura case when d.maxvto > getdate() then 'activo' else 'no'  end

    sábado, 2 de febrero de 2019 11:38