Ver Mensaje Individual
  #6 (permalink)  
Antiguo 01/11/2012, 13:05
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: Al hacer LEFT JOIN se me Altera el SUM

Hola de nuevo verdolaga1989:

Efectivamente, tienes un problema con las relaciones, pero no tanto que falte expresar alguna condición, sino en cuanto a la cardinalidad... de acuerdo a los datos que pones de ejemplo (y después de corregir algunos errores en las sentencias que pusiste) puedo observa que una factura puede tener N pagos... aquí es donde está el problema... al hacer la relación como lo estás haciendo, ESTÁS DUPLICANDO EL MONTO DE LA FACTURA...

Observa este ejemplo:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla1;
  2. +---------+-------------+-------+
  3. | factura | descripcion | total |
  4. +---------+-------------+-------+
  5. |       1 | uno         |    10 |
  6. |       2 | dos         |    30 |
  7. +---------+-------------+-------+
  8. 2 rows in set (0.00 sec)
  9.  
  10. mysql> SELECT * FROM tabla2;
  11. +------+---------+-------+
  12. | pago | factura | valor |
  13. +------+---------+-------+
  14. |    1 |       1 |     5 |
  15. |    2 |       1 |     1 |
  16. |    3 |       1 |     2 |
  17. |    4 |       2 |    15 |
  18. |    5 |       2 |     5 |
  19. +------+---------+-------+
  20. 5 rows in set (0.00 sec)
  21.  
  22. mysql> SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.factura = tabla2.factura
  23. ;
  24. +---------+-------------+-------+------+---------+-------+
  25. | factura | descripcion | total | pago | factura | valor |
  26. +---------+-------------+-------+------+---------+-------+
  27. |       1 | uno         |    10 |    1 |       1 |     5 |
  28. |       1 | uno         |    10 |    2 |       1 |     1 |
  29. |       1 | uno         |    10 |    3 |       1 |     2 |
  30. |       2 | dos         |    30 |    4 |       2 |    15 |
  31. |       2 | dos         |    30 |    5 |       2 |     5 |
  32. +---------+-------------+-------+------+---------+-------+
  33. 5 rows in set (0.00 sec)

Observa que aquí no estoy agrupando, pero observa como los montos de la tabla1 SE DUPLICAN POR CADA REGISTRO QUE APARECE EN LA TABLA2... la relación en estas tablas (como en tu caso) es de 1 a N, pero para evitar esto tendrías que hacer una relación 1 a 1... ¿cómo logras eso? consolidando o agrupando los elementos de la tabla2 ANTES DE HACER EL JOIN... es decir, haces algo como esto:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla1
  2.     -> INNER JOIN ( SELECT factura, SUM(valor) valor
  3.     ->              FROM tabla2
  4.     ->              GROUP BY factura ) T2
  5.     -> ON tabla1.factura = t2.factura;
  6. +---------+-------------+-------+---------+-------+
  7. | factura | descripcion | total | factura | valor |
  8. +---------+-------------+-------+---------+-------+
  9. |       1 | uno         |    10 |       1 |     8 |
  10. |       2 | dos         |    30 |       2 |    20 |
  11. +---------+-------------+-------+---------+-------+
  12. 2 rows in set (0.00 sec)

Observa la consulta marcada como T2... aquí se realiza la agrupación POR FACTURA, por lo tanto la relación entre esta tabla y la tabla 1 AHORA SI ES 1 A 1...

Tú tendrías que hacer algo lo mismo, es decir, algo como esto:

Código:
SELECT 
  c.idCliente,
   c.nombre, 
  SUM(f.total) total, 
  SUM(IFNULL(p.pagado, 0)) pagado
FROM tblcliente c
INNER JOIN tblfactura f  ON c.IdCliente=f.IdCliente
LEFT JOIN ( SELECT NroFactura, SUM(valor) pagado 
                   FROM tblpagosxfactura GROUP BY NroFactura) p 
ON f.NroFactura = p.NroFactura
GROUP BY c.IdCliente, c.nombre
Observa la consulta marcada con rojo, esto sirve para consolidar (agrupar) todos los pagos de cada factura...

Haz la prueba y nos comentas.

Saludos
Leo.