Ver Mensaje Individual
  #2 (permalink)  
Antiguo 28/08/2012, 10:13
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 10 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.