Principales respuestas
SUM Total de varias tablas

Pregunta
-
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
Todas las respuestas
-
-
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.
-
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
-
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!
-
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
-