Ver Mensaje Individual
  #6 (permalink)  
Antiguo 24/04/2012, 11:10
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 meses
Puntos: 447
Respuesta: Consulta selectiva

Hola de nuevo computer_si:

Lo que planteas ahora es completamente distinto al problema original, ya que aquí será necesario hacer una agrupación de registros, ya que cada ref puede tener uno o varios registros con mov=2... (y supongo que será posible que también tenga varios registros con mov=1)

Si estoy en lo cierto, esto parece ser una especie de cargos y abonos, o ventas y compras, donde el resultado que esperas sea aquellas cuentas que no están saldadas... Para esto, hay muchas formas de poder abordar el problema, por ejemplo checa este script:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla;
  2. +------+------+------+---------+
  3. | reg  | ref  | mov  | imp     |
  4. +------+------+------+---------+
  5. |    1 | A1   | 1    |  500.00 |
  6. |    2 | A2   | 1    |  200.00 |
  7. |    3 | A3   | 1    |  300.00 |
  8. |    4 | A4   | 1    |  500.00 |
  9. |    5 | A5   | 1    | 4500.00 |
  10. |    6 | A1   | 2    |  500.00 |
  11. |    7 | A6   | 1    |  500.00 |
  12. |    8 | A5   | 2    |  500.00 |
  13. |    9 | A5   | 2    | 2500.00 |
  14. |   10 | A5   | 2    |  500.00 |
  15. +------+------+------+---------+
  16. 10 rows in set (0.07 sec)
  17.  
  18. mysql> SELECT ref,
  19.     -> IFNULL((SELECT SUM(T2.imp) FROM tabla T2
  20.     -> WHERE T1.ref = T2.ref AND T2.mov = 1), 0) -
  21.     -> IFNULL((SELECT SUM(T2.imp) FROM tabla T2
  22.     -> WHERE T1.ref = T2.ref AND T2.mov = 2), 0) saldo
  23.     -> FROM tabla T1 GROUP BY ref HAVING saldo != 0;
  24. +------+---------+
  25. | ref  | saldo   |
  26. +------+---------+
  27. | A2   |  200.00 |
  28. | A3   |  300.00 |
  29. | A4   |  500.00 |
  30. | A5   | 1000.00 |
  31. | A6   |  500.00 |
  32. +------+---------+
  33. 5 rows in set (0.00 sec)


En el select se realizan dos subconsultas (una para obtener la sumatoria de los mov=1 para cada ref y otra para obtener la sumatoria de los mov=2), se realiza la resta y se muestran sólo aquellos registros que tengan un saldo distinto de 0. Esta es posible que no sea la manera más eficiente de hacer lo que quieres, pero es una de ellas.

En cuanto a la pregunta del WHILE, esta no corresponde a un tema de MySQL, por lo que debes publicarla en el foro correspondiente,

http://www.forosdelweb.com/f18/

Saludos
Leo.