Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Union con sumas y restas

Estas en el tema de Union con sumas y restas en el foro de Mysql en Foros del Web. Buenos dias a todos: A ver si alguien me puede ayudar, mi planteamiento es el siguiente: Tengo dos bases de datos con campos iguales, lo ...
  #1 (permalink)  
Antiguo 27/08/2012, 23:44
 
Fecha de Ingreso: febrero-2011
Mensajes: 85
Antigüedad: 13 años, 4 meses
Puntos: 3
Union con sumas y restas

Buenos dias a todos:
A ver si alguien me puede ayudar, mi planteamiento es el siguiente:

Tengo dos bases de datos con campos iguales, lo que deseo es hacer una union y sumar referencias iguales de un base y restarselas a la otra base de referencias iguales y que solo me muestre el saldo.

bd1
ref---mov---imp
A---1----2,000.00
B---1----3,000.00
C---1----900.00
D---1----2,500.00

bd2
ref---mov---imp
A---1----600.00
A---2----300.00
B---1----3,000.00
C---1----200.00

El resultado debe de ser

ref---mov---imp
A---1----1,100.00
C---1----700.00
D---1----2,500.00

Solo logro hacer la union pero no doy una en cuanto ha la suma y la resta

Gracias anticipadas
  #2 (permalink)  
Antiguo 28/08/2012, 10:13
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 6 meses
Puntos: 447
Respuesta: Union con sumas y restas

hola computer_si:

En realidad tienes muchas formas de realizar esta consulta, aunque hacerla con UNION no creo que sea una de las más adecuadas... creo que la forma más sencilla que tienes sería con subconsultas y JOIN's... agrupando cada tabla por separado antes de hacer la resta, sería más o menos así:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM bd1;
  2. +------+------+------+
  3. | ref  | mov  | imp  |
  4. +------+------+------+
  5. | A    |    1 | 2000 |
  6. | B    |    1 | 3000 |
  7. | C    |    1 |  900 |
  8. | D    |    1 | 2500 |
  9. +------+------+------+
  10. 4 rows in set (0.01 sec)
  11.  
  12. mysql> SELECT * FROM bd2;
  13. +------+------+------+
  14. | ref  | mov  | imp  |
  15. +------+------+------+
  16. | A    |    1 |  600 |
  17. | A    |    2 |  300 |
  18. | B    |    1 | 3000 |
  19. | C    |    1 |  200 |
  20. +------+------+------+
  21. 4 rows in set (0.00 sec)
  22.  
  23. mysql> SELECT T1.ref, T1.total - IFNULL(T2.total, 0) gran_total
  24.     -> FROM
  25.     ->   (SELECT ref, SUM(imp) total
  26.     ->    FROM bd1 GROUP BY ref) T1
  27.     -> LEFT JOIN
  28.     ->   (SELECT ref, SUM(imp) total
  29.     ->    FROM bd2 GROUP BY ref) T2
  30.     -> ON T1.ref = T2.ref;
  31. +------+------------+
  32. | ref  | gran_total |
  33. +------+------------+
  34. | A    |       1100 |
  35. | B    |          0 |
  36. | C    |        700 |
  37. | D    |       2500 |
  38. +------+------------+
  39. 4 rows in set (0.01 sec)

Observa en primer lugar que hago dos subconsultas, marcadas como T1 y T2, donde agrupo cada una de las tablas (pensando que en ambas tablas pueda haber múltiples registros para cada ref... una vez que los datos están agrupados los uno mediante un LEFT JOIN (no utilizo INNER pues hay ref de la tabla bd1 que no aparecen en la tabla bd2)... la parte del IFNULL es justamente para los casos donde no tengas que restar nada (en realidad resta un 0, pues de lo contrario el resultado sería un NULL). Dale un vistazo y nos comentas si te sirvió.

Saludos
Leo.
  #3 (permalink)  
Antiguo 28/08/2012, 19:18
 
Fecha de Ingreso: febrero-2011
Mensajes: 85
Antigüedad: 13 años, 4 meses
Puntos: 3
Respuesta: Union con sumas y restas

Hola leonardo_josue

Ante todo muchas gracias por la respuesta, en efecto si funciona, y en cuanto a la funcion IFNULL sabes si existe alguna equivalencia para bases de datos de firbird, se que no es este el lugar, pero estoy tratando de adaptar el codigo a una bd de firebird ya que no encuentro en esta web ningun lugar para el tema.

Nuevamente gracias y saludos desde ya.
  #4 (permalink)  
Antiguo 29/08/2012, 08:26
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 6 meses
Puntos: 447
Respuesta: Union con sumas y restas

Hola de nuevo:

Tengo muchos años de no trabajar con Firebird, pero checando la documentación encontré esto:

http://www.firebirdsql.org/manual/es...con-nulls.html

Dependiendo de la versión de Firebird con la que estés trabajando sería la manera en que puedas sustituir esta función.

En el último de los casos, supongo que Firebird debe soportar la sentencia CASE-WHEN... podrías hacerlo más o menos así:

Código:
T1.total - CASE WHEN T2.total IS NULL THEN 0 ELSE T2.total END 
Saludos
Leo.
  #5 (permalink)  
Antiguo 29/08/2012, 22:36
 
Fecha de Ingreso: febrero-2011
Mensajes: 85
Antigüedad: 13 años, 4 meses
Puntos: 3
Respuesta: Union con sumas y restas

Nuevamente gracias Leo

Voy a checar tu codigo, no esta de mas aprender mas opciones y te comento que me di a la tarea de investigar y encontre lo siguiente y esto lo posteo como aportacion.

T1.total - coalesce(T2.total,0) gran_total

Segun entendi el "coalesce" hace las funciones del ifnull en la version 2.5 de firebird y de hecho me esta funcionando.

Continuando con la misma consulta y abusando de tu gentileza, la ref esta enlazada a un catalogo x que contiene varios campos entre ellos ref y nombre, como puedo mostrar el nombre en base a la ref utilizando la consulta hasta donde va.

Pregunta tendria que hacer un JOIN a la bd de referencias en cada subconsulta??

SELECT T1.ref, T1.total - IFNULL(T2.total, 0) gran_total
FROM (SELECT ref, SUM(imp) total FROM bd1 INNER JOIN bd3 ON bd1.ref=bd3.ref GROUP BY ref) T1
LEFT JOIN
(SELECT ref, SUM(imp) total FROM bd2 INNER JOIN bd3 ON bd2.ref=bd3.ref GROUP BY ref) T2
ON T1.ref = T2.ref;

Parece que de esta forma funciona ya que no me marca ningun error la consulta, el problema es como muestro el nombre de la referencia??
si pongo en el primer select T1.nombre me dice que el campo no se encuentra o no existe.

Gracias anticipadas y Saludos

Última edición por computer_si; 29/08/2012 a las 23:00
  #6 (permalink)  
Antiguo 31/08/2012, 12:51
 
Fecha de Ingreso: febrero-2011
Mensajes: 85
Antigüedad: 13 años, 4 meses
Puntos: 3
Respuesta: Union con sumas y restas

buenas tardes Leo

Ya quedo finalizada mi consulta y funcionando, tendre que leer bastante, ya que solo estoy familiarizado con consultas sencillas y no tan complejas como la que me ayudaste hacer, ampliando el panorama, en bd1 siempre va a existir solo una vez la referencia, pero en bd2 puede existir o no varias veces la referencia y de diferente naturaleza, cargo o abono, por consiguiente cree un campo llamado naturaleza con 1 o -1 dependiendo el tipo y al momento de hacer la suma, multiplico imp * naturaleza y en el SELECT principal lo sumo en vez de restarlo y asunto solucionado.

SELECT T1.nombre, T1.ref, T1.total + coalesce(T2.total,0) gran_total
FROM (SELECT bd3.nombre, ref, SUM(imp * naturaleza) total FROM bd1 INNER JOIN bd3 ON bd1.ref=bd3.ref GROUP BY bd3.nombre, ref) T1
LEFT JOIN
(SELECT ref, SUM(imp * naturaleza) total FROM bd2 INNER JOIN bd3 ON bd2.ref=bd3.ref GROUP BY ref) T2
ON T1.ref = T2.ref;

Solo me queda una duda referente al campo nombre, porque en los SELECT de las subconsultas tengo que hacer referencia a los campos que quiero que se muestren en el SELECT de la consulta principal asi como en el GROUP BY, porque si no los referencio no me salen en el SELECT principal. Esto es solo por saber tecnicamente como funciona esta consulta.

Saludos

Etiquetas: restas, sumas, union, campos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:43.