none
Modificar total de un campo en base a valores de otra tabla usando parámetros de fecha. RRS feed

  • Pregunta

  • Hola, tengo la siguiente situación y duda la cual les explicaré a modo de ejemplo.

    Tengo una tabla que contiene datos de facturas.

    

    Y otra tabla donde se guardan los pagos que se aplican a dichas facturas. 

    Lo que necesito es parecido a la siguiente imagen:

    SELECT FACTURA,SALDO_PENDIENTE WHERE FECHA_FACTURA BETWEEN '01-09-2019' AND '03-09-2019'

    Mostrar las facturas en base a un rango de fecha y que a su vez se consideren los pagos aplicados a éstas también dentro de ese mismo rango para que el total se vea afectado.

    Se trata de algo parecido a un estado de cuenta pero en este caso las facturas deben mostrarse una sola vez al igual que su total.

    Agradecería si pudieran darme sugerencias acerca de cómo puedo obtener esta información para adecuarla a mi información real, utilizo SQL Server 2012.

    Saludos.


    miércoles, 18 de septiembre de 2019 21:19

Respuestas

  • Deleted
    • Propuesto como respuesta Javi Fernández F jueves, 19 de septiembre de 2019 4:04
    • Marcado como respuesta Zarpis lunes, 23 de septiembre de 2019 15:30
    miércoles, 18 de septiembre de 2019 22:12
  • Hola Zarpis:

    Otra manera adicional a la que te ha expresado Jose Diz es:

    CREATE TABLE Facturas
    (Factura       VARCHAR(2), 
     Fecha_Factura DATE, 
     Total         INT
    );
    GO
    CREATE TABLE Pagos
    (Pago             VARCHAR(2), 
     FechaPago        DATE, 
     Factura_Afectada VARCHAR(2), 
     Monto            INT
    );
    GO
    
    /* UTILIZAMOS LA FECHAS SIEMPRE
    EN FORMATO ('yyyyMMdd') Y NOS 
    EVITAMOS DE PROBLEMAS DE CONVERSIÓN */
    INSERT INTO Facturas
    (Factura, Fecha_Factura, Total)
    VALUES
    ('F1','20190901',10000),
    ('F2','20190901',  300),
    ('F4','20190903',  500);
    GO
    INSERT INTO Pagos
    (Pago, FechaPago, Factura_Afectada, Monto)
    VALUES
    ('P1','20190901','F1', 100),
    ('P2','20190902','F1',2000),
    ('P3','20190905','F2', 100);
    GO

    Con el escenario preparado.

    DECLARE @FECHAFILTRO_DESDE DATE='20190901';
    DECLARE @FECHAFILTRO_HASTA DATE='20190903';
    WITH LasFacturas AS
    (
    /* En el primer conjunto recoges las facturas para el rango*/
        SELECT 
    	   Factura,
    	   Total
    	   FROM Facturas
    	   Where Fecha_Factura between @FECHAFILTRO_DESDE and @FECHAFILTRO_HASTA
    ),Pagado AS
    (
    /* En el segundo conjunto recoges los pagos por factura para el rango */
        Select 
    	   Factura_Afectada,
    	   SUM(Monto) as Monto
    	   from Pagos
    	   where FechaPago between @FECHAFILTRO_DESDE and @FECHAFILTRO_HASTA
        Group by Factura_Afectada
    )
    /* En la salida mezclas los dos conjuntos */
    Select f.Factura, f.Total-ISNULL(p.Monto,0) As Saldo_Pendiente 
    from 
        LasFacturas f left join 
        Pagado p on f.Factura = p.Factura_Afectada

    Salida


    • Marcado como respuesta Zarpis lunes, 23 de septiembre de 2019 15:30
    jueves, 19 de septiembre de 2019 4:04

Todas las respuestas

  • Hola   Zarpis

     

    Gracias por levantar tu consulta en los foros de MSDN. Con respecto a la misma,  te  sugiero realizar lo siguiente:

     

    •  Puedes utilizar la sentencia Alter para cambiar los valores de un campo. 

     

     

    Gracias por usar los foros de MSDN.

     

    Pablo Rubio

     

     ____

     

    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.

    miércoles, 18 de septiembre de 2019 21:50
    Moderador
  • Deleted
    • Propuesto como respuesta Javi Fernández F jueves, 19 de septiembre de 2019 4:04
    • Marcado como respuesta Zarpis lunes, 23 de septiembre de 2019 15:30
    miércoles, 18 de septiembre de 2019 22:12
  • Gracias por tu respuesta Pablo Rubio pero quizás no me expliqué. Dichos totales ignoro cómo van a quedar puesto que se debe calcular en tiempo de ejecución en base al rango de fecha que el usuario seleccione, por lo que un alter no resuelve para nada mi necesidad.

    miércoles, 18 de septiembre de 2019 22:35
  • Hola Zarpis:

    Otra manera adicional a la que te ha expresado Jose Diz es:

    CREATE TABLE Facturas
    (Factura       VARCHAR(2), 
     Fecha_Factura DATE, 
     Total         INT
    );
    GO
    CREATE TABLE Pagos
    (Pago             VARCHAR(2), 
     FechaPago        DATE, 
     Factura_Afectada VARCHAR(2), 
     Monto            INT
    );
    GO
    
    /* UTILIZAMOS LA FECHAS SIEMPRE
    EN FORMATO ('yyyyMMdd') Y NOS 
    EVITAMOS DE PROBLEMAS DE CONVERSIÓN */
    INSERT INTO Facturas
    (Factura, Fecha_Factura, Total)
    VALUES
    ('F1','20190901',10000),
    ('F2','20190901',  300),
    ('F4','20190903',  500);
    GO
    INSERT INTO Pagos
    (Pago, FechaPago, Factura_Afectada, Monto)
    VALUES
    ('P1','20190901','F1', 100),
    ('P2','20190902','F1',2000),
    ('P3','20190905','F2', 100);
    GO

    Con el escenario preparado.

    DECLARE @FECHAFILTRO_DESDE DATE='20190901';
    DECLARE @FECHAFILTRO_HASTA DATE='20190903';
    WITH LasFacturas AS
    (
    /* En el primer conjunto recoges las facturas para el rango*/
        SELECT 
    	   Factura,
    	   Total
    	   FROM Facturas
    	   Where Fecha_Factura between @FECHAFILTRO_DESDE and @FECHAFILTRO_HASTA
    ),Pagado AS
    (
    /* En el segundo conjunto recoges los pagos por factura para el rango */
        Select 
    	   Factura_Afectada,
    	   SUM(Monto) as Monto
    	   from Pagos
    	   where FechaPago between @FECHAFILTRO_DESDE and @FECHAFILTRO_HASTA
        Group by Factura_Afectada
    )
    /* En la salida mezclas los dos conjuntos */
    Select f.Factura, f.Total-ISNULL(p.Monto,0) As Saldo_Pendiente 
    from 
        LasFacturas f left join 
        Pagado p on f.Factura = p.Factura_Afectada

    Salida


    • Marcado como respuesta Zarpis lunes, 23 de septiembre de 2019 15:30
    jueves, 19 de septiembre de 2019 4:04