none
consulta sql RRS feed

  • Pregunta

  • Amigos podrian apoyarme

    tengo 2 tablas

    t1 idcobro,total (esta tiene un solo idcobro)

    t2 idcobro,importe (esta tiene mas de 1 idcobro)

    pretendo sumar de la t2 los importes (agrupando por idcobro, y sumando importes) y compararlos con el total de la t2 y sacar la diferencia en una nueva consulta asi:

    idcobro,importe,total,diferenciaentreimporteytotal

    gracias


    viernes, 1 de marzo de 2019 19:14

Respuestas

  • Hola Edgar Brito Molina:

    Una posible solución a tu planteamiento:

    drop table if exists dbo.t1; 
    drop table if exists dbo.t2;
    
    create table t1 (idcobro int, total float)
    create table t2 (idcobro int, detalle int, importe float)
    go
    insert into t1 (idcobro, total)
    values
    (1,1000),
    (2,2000);
    insert into t2 (idcobro, detalle, importe)
    values
    (1,1,100),
    (1,2,200),
    (1,3,200),
    (2,1,100),
    (2,2,500);
    go
    

    Con el escenario creado y relleno de datos como ejemplo.

    /* solución */
    SELECT t1.idcobro, 
           t.sumdetalle, 
           SUM(t1.total) AS total, 
           SUM(t1.total) - t.sumdetalle AS resta
    FROM t1
         CROSS APPLY
    (
        SELECT SUM(importe) AS sumdetalle, 
               idcobro
        FROM t2
        WHERE t2.idcobro = t1.idcobro
        GROUP BY idcobro
    ) t
    GROUP BY t1.idcobro, 
             t.sumdetalle;

    Otra posible solución

    -------------
    -- solucion 2
    -------------
    
    SELECT t1.idcobro, 
           t2.sumdetalle, 
           SUM(t1.total) AS total, 
           (SUM(t1.total) - ISNULL(t2.sumdetalle, 0)) AS resta
    FROM t1
         LEFT JOIN
    (
        SELECT SUM(importe) AS sumdetalle, 
               idcobro
        FROM t2
        GROUP BY idcobro
    ) AS t2 ON t1.idcobro = t2.idcobro
    GROUP BY t1.idcobro, 
             t2.sumdetalle;

    Salida

    viernes, 1 de marzo de 2019 19:31

Todas las respuestas

  • Hola Edgar Brito Molina:

    Una posible solución a tu planteamiento:

    drop table if exists dbo.t1; 
    drop table if exists dbo.t2;
    
    create table t1 (idcobro int, total float)
    create table t2 (idcobro int, detalle int, importe float)
    go
    insert into t1 (idcobro, total)
    values
    (1,1000),
    (2,2000);
    insert into t2 (idcobro, detalle, importe)
    values
    (1,1,100),
    (1,2,200),
    (1,3,200),
    (2,1,100),
    (2,2,500);
    go
    

    Con el escenario creado y relleno de datos como ejemplo.

    /* solución */
    SELECT t1.idcobro, 
           t.sumdetalle, 
           SUM(t1.total) AS total, 
           SUM(t1.total) - t.sumdetalle AS resta
    FROM t1
         CROSS APPLY
    (
        SELECT SUM(importe) AS sumdetalle, 
               idcobro
        FROM t2
        WHERE t2.idcobro = t1.idcobro
        GROUP BY idcobro
    ) t
    GROUP BY t1.idcobro, 
             t.sumdetalle;

    Otra posible solución

    -------------
    -- solucion 2
    -------------
    
    SELECT t1.idcobro, 
           t2.sumdetalle, 
           SUM(t1.total) AS total, 
           (SUM(t1.total) - ISNULL(t2.sumdetalle, 0)) AS resta
    FROM t1
         LEFT JOIN
    (
        SELECT SUM(importe) AS sumdetalle, 
               idcobro
        FROM t2
        GROUP BY idcobro
    ) AS t2 ON t1.idcobro = t2.idcobro
    GROUP BY t1.idcobro, 
             t2.sumdetalle;

    Salida

    viernes, 1 de marzo de 2019 19:31
  • Muchas gracias por tu apoyo me sirvió. 
    viernes, 1 de marzo de 2019 20:02
  • De nada
    viernes, 1 de marzo de 2019 20:30