none
SUM Total de varias tablas RRS feed

  • Pregunta

  • Hola,

    Necesito sumar el total de un campo de varias tablas y sumarlo entre si, estoy buscando informacion pero no encuentro nada...

    Por ejemplo algo asi:

    Select SUM(total.A + total.B) from tabla1 as A, tabla2 as B WHERE A.id=1 and B.id=1

    sábado, 7 de septiembre de 2019 11:07

Respuestas

  • Hola J.Ramon:

    Una opción

    CREATE TABLE compramotos
    (numero INT, 
     total  FLOAT
    );
    CREATE TABLE compracoches
    (numero INT, 
     total  FLOAT
    );
    CREATE TABLE compracascos
    (numero INT, 
     total  FLOAT
    );
    CREATE TABLE comprabotas
    (numero INT, 
     total  FLOAT
    );
    GO
    INSERT INTO compramotos
    (numero, 
     total
    )
    VALUES
    (1, 
     1005.40
    ),
    (2, 
     1035.99
    ),
    (3, 
     4070.10
    );
    GO
    INSERT INTO compracoches
    (numero, 
     total
    )
    VALUES
    (1, 
     20012.15
    ),
    (3, 
     18435.12
    );
    GO
    INSERT INTO compracascos
    (numero, 
     total
    )
    VALUES
    (2, 
     175
    );
    GO
    INSERT INTO comprabotas
    (numero, 
     total
    )
    VALUES
    (3, 
     199.45
    ),
    (4, 
     200.21
    );
    GO

    Solución

    Select SUM(total) as total, numero
    from (
        Select SUM(total) as total, numero
        from compracoches
        group by numero
        union all
        Select SUM(total), numero
        from compramotos
        group by numero
        union all
        Select SUM(total), numero
        from compracascos
        group by numero
        union all
        Select SUM(total), numero
        from comprabotas
        group by numero
    ) as t
    group by t.numero
    

    Salida

    total                  numero
    ---------------------- -----------
    21017,55              1
    1210,99                2
    22704,67              3
    200,21                  4

    (4 filas afectadas)

    Si sumas todos los conjuntos independientemente, y luego introduces las consultas dentro de una tabla derivada, puedes sumarla como un solo conjunto.

    Tabla derivada

    https://javifer2.blogspot.com/search/label/Tabla%20derivadas



    • Marcado como respuesta J.Ramon lunes, 9 de septiembre de 2019 17:22
    lunes, 9 de septiembre de 2019 17:01

Todas las respuestas

  • Deleted
    sábado, 7 de septiembre de 2019 11:19
  • Gracias por la respuesta.

    - Las tablas se relacionan por un número de cliente llamado numero.

    - No siempre hay valor, por lo que una tabla puede no devolver registros.

    - En total son 6 tablas. Todas tienen un campo numero y un campo total, pero hay tablas que no tienen ningun registro.

    *Pongo un ejemplo, una tabla es de compra de motos, otra de coches, otra de cascos, otra de botas.... Entonces puede ser que un cliente con numero=X haya comprado moto pero no coches....

    El ejemplo me sirve, pero cuando en una tabla no existe ningun registro con ese numero, me devuelve null.

    Un saludo.

    lunes, 9 de septiembre de 2019 16:40
  • Hola J.Ramon:

    Una opción

    CREATE TABLE compramotos
    (numero INT, 
     total  FLOAT
    );
    CREATE TABLE compracoches
    (numero INT, 
     total  FLOAT
    );
    CREATE TABLE compracascos
    (numero INT, 
     total  FLOAT
    );
    CREATE TABLE comprabotas
    (numero INT, 
     total  FLOAT
    );
    GO
    INSERT INTO compramotos
    (numero, 
     total
    )
    VALUES
    (1, 
     1005.40
    ),
    (2, 
     1035.99
    ),
    (3, 
     4070.10
    );
    GO
    INSERT INTO compracoches
    (numero, 
     total
    )
    VALUES
    (1, 
     20012.15
    ),
    (3, 
     18435.12
    );
    GO
    INSERT INTO compracascos
    (numero, 
     total
    )
    VALUES
    (2, 
     175
    );
    GO
    INSERT INTO comprabotas
    (numero, 
     total
    )
    VALUES
    (3, 
     199.45
    ),
    (4, 
     200.21
    );
    GO

    Solución

    Select SUM(total) as total, numero
    from (
        Select SUM(total) as total, numero
        from compracoches
        group by numero
        union all
        Select SUM(total), numero
        from compramotos
        group by numero
        union all
        Select SUM(total), numero
        from compracascos
        group by numero
        union all
        Select SUM(total), numero
        from comprabotas
        group by numero
    ) as t
    group by t.numero
    

    Salida

    total                  numero
    ---------------------- -----------
    21017,55              1
    1210,99                2
    22704,67              3
    200,21                  4

    (4 filas afectadas)

    Si sumas todos los conjuntos independientemente, y luego introduces las consultas dentro de una tabla derivada, puedes sumarla como un solo conjunto.

    Tabla derivada

    https://javifer2.blogspot.com/search/label/Tabla%20derivadas



    • Marcado como respuesta J.Ramon lunes, 9 de septiembre de 2019 17:22
    lunes, 9 de septiembre de 2019 17:01
  • Funciona perfectamente... Muchas gracias Javi, no soy muy de transact...jeje y se me escapan muchas cosas... Los group by nunca los llegué a ententer...por ejemplo! jaja

    Finalmente lo dejé asi:

    select sum(deuda) as deuda
    from (
    select sum(DEUDA) as deuda,numero from fvenpac group by NUMERO
    UNION ALL
    select sum(DEUDA) as deuda,numero from fvenpac2 group by NUMERO
    UNION ALL
    select sum(DEUDA) as deuda,numero from FDEUVAR group by NUMERO
    ) as t
    where numero='19528'
    Lo probé con 3 tablas, ahora solo me falta añadir 3 mas y probarlo en VB.Net

    Saludos!

    lunes, 9 de septiembre de 2019 17:23
  • Otra posible solución:

    ;WITH CTE
         AS (SELECT SUM(ISNULL(c.total, 0)) AS TOTALCOCHES, 
                    SUM(ISNULL(m.total, 0)) AS TOTALMOTOS, 
                    SUM(ISNULL(D.TOTAL, 0)) AS TOTALCASCOS, 
                    SUM(ISNULL(E.TOTAL, 0)) AS TOTALBOTAS, 
                    COALESCE(c.numero, m.numero, d.numero, e.numero) AS NUMERO
             FROM compracoches c
                  FULL OUTER JOIN compramotos m ON c.numero = m.numero
                  FULL OUTER JOIN compracascos d ON c.numero = d.numero
                  FULL OUTER JOIN comprabotas e ON c.numero = e.numero
             GROUP BY c.numero, 
                      m.numero, 
                      e.numero, 
                      d.numero)
         SELECT SUM(CTE.TOTALCOCHES+
                CTE.TOTALMOTOS+
                CTE.TOTALCASCOS+ 
                CTE.TOTALBOTAS) AS TOTAL,
                CTE.NUMERO
         FROM CTE
    	GROUP BY CTE.NUMERO

    Utilizando una tabla de expresión común y relacionando los conjuntos con FULL JOIN

    https://javifer2.blogspot.com/search/label/tablas%20de%20expresión%20común%20%281%29

    lunes, 9 de septiembre de 2019 17:29
  • Deleted
    lunes, 9 de septiembre de 2019 17:45