none
armar cuenta corriente query SQL RRS feed

  • Pregunta

  • Hola estoy tratando de armar una cuenta corriente en SQL pero no me doy cuenta como hacer la query.

    De momento estaba haciendo algo asi: pero lo que no se como hacer es que si se trata de otro comprobante me lo sume en otra columna "HABER", es decir no se si tengo alguna forma de ir sumando en una columna u otra dependiendo del tipo de comprobante.

    select TiposComprobanteVenta.nombre,ComprobantesVenta.letraComprobante,numComprobante,fechaEmision,DEBE
     from ComprobantesVenta join TiposComprobanteVenta on ComprobantesVenta.idTipoComprobante=TiposComprobanteVenta.idTipoComprobante
     join (select idComprobanteVenta,sum(cantidad*precio) as DEBE from DetallesComprobanteVenta
     group by idComprobanteVenta) t on t.idComprobanteVenta=ComprobantesVenta.idComprobanteVenta
     
    Este es el resultado de la query, me faltaria agregar una columna "HABER" pero que sólo aparezca sumado si corresponde a una Nota de crédito por ejemplo..

    como podria hacer esa parte "dinámica" si se la puede llamar asi..

    Otra alternativa que se me ocurre que seria fácil de hacer, es traer todos los comprobantes como se muestra en la imagen y luego yo desde c# analizo que tipo de comprobante es y en base a eso ubico el saldo en una columna DEBE o en HABER. Pero bueno capaz hacerlo directamente en SQL era más óptimo. Yo no guardo nada de la cuenta corriente, la idea es que se calcule siempre que se la vaya a consultar

    PD: Todos los comprobantes (Facturas y notas credito/debito) están en la misma tabla, lo que son recibos de pago están en otra tabla aparte pero de momento quiero arrancar con los comprobantes.. si alguien me puede orientar con esto, despues veo con algún join de agregarle los recibos

    saludos



    lunes, 26 de agosto de 2019 3:24

Respuestas

  • Hola Artemis Spectrum:

    Existen muchas variantes para montar lo que solicitas, pero lo primero a tener claro es como has diseñado las tablas, y las relaciones entre ellas.

    Te expongo un ejemplo, de lo que has contado, y una posible solución.

    CREATE TABLE ComprobantesVenta
    (idTipoComprobante  INT, 
     idComprobanteVenta INT, 
     letraComprobante   VARCHAR(1), 
     numComprobante     VARCHAR(10), 
     fechaEmision       DATETIME
    );
    CREATE TABLE TiposComprobanteVenta
    (idTipoComprobante INT, 
     nombre            VARCHAR(15)
    );
    CREATE TABLE DetallesComprobanteVenta
    (idComprobanteVenta INT, 
     cantidad           INT, 
     precio             INT
    );
    GO 
    INSERT INTO ComprobantesVenta
    (idTipoComprobante, 
     idComprobanteVenta, 
     letraComprobante, 
     numComprobante, 
     fechaEmision
    )
    VALUES
    (1,  1,  'A',  '0000001',  '20190825 15:00'),
    (2,  2,  'A',  '0000001',  '20190825 15:00'),
    (1,  3,  'B',  '0000002',  '20190825 16:00'),
    (2,  4,  'B',  '0000002',  '20190825 16:00');
    INSERT INTO TiposComprobanteVenta
    (idTipoComprobante, 
     nombre
    )
    VALUES
    (1,  'Factura'),
    (2,  'Nota');
    
    
    INSERT INTO DetallesComprobanteVenta
    (idComprobanteVenta, 
     cantidad, 
     precio
    )
    VALUES
    (1,  10,  15),
    (2,  21,  13),
    (3,  6,  4),
    (4,  31,  3);
    GO
    

    Fin del escenario.

    Solución 

    ;WITH cte
         AS (SELECT c.numComprobante, 
                    SUM(CASE
                            WHEN c.idTipoComprobante = 1
                            THEN cantidad * precio
                            ELSE 0
                        END) AS debe, 
                    SUM(CASE
                            WHEN c.idTipoComprobante = 2
                            THEN cantidad * precio
                            ELSE 0
                        END) AS haber
             FROM DetallesComprobanteVenta d
                  INNER JOIN ComprobantesVenta c ON d.idComprobanteVenta = c.idComprobanteVenta
             GROUP BY numComprobante)
         SELECT t.nombre, 
                v.letraComprobante, 
                c.numComprobante, 
                v.fechaEmision, 
                c.debe,
    		  c.haber
         FROM ComprobantesVenta v
              JOIN TiposComprobanteVenta t ON v.idTipoComprobante = t.idTipoComprobante
              JOIN Cte c on v.numComprobante = c.numComprobante
        where v.idTipoComprobante = 1
    

    Salida

    lunes, 26 de agosto de 2019 4:50