Hola sebandrescc2:
No nos pones datos de ejemplo, pero creo saber por donde va el problema. De entrada te comento que no es recomendable que mezcles JOIN'S implícitos con JOIN's explícitos... es decir, por un lado tienes en el FROM esto:
Código:
...
FROM (proyectos p,clientes c)
...
WHERE
p.id_cliente = c.id
...
peor al mismo tiempo estás realizando varios LEFT JOIN... la primer forma YA NO ES RECOMENDABLE, en lugar de esto puedes hacer simplemente un INNER JOIN así:
Código:
...
FROM proyectos p
INNER JOIN clientes c ON p.id_cliente = c.id
LEFT JOIN ...
...
Ahora bien, pasando al tema de los datos erroneos. puedo suponer que tienes una relación 1 a muchos entre cada una de tus tablas, es decir, y proyecto puede tener muchos pagos, muchos gastos y muchos salarios. Cuando haces un JOIN entre dos tablas así NO HAY PROBLEMA, pero cuando incluyes una tercer tabla entonces la relación pasa a ser de MUCHOS A MUCHOS, por lo tanto los cálculos ya no son iguales. Trataré de poner un ejemplo práctico. imagina que tienes esto:
Código MySQL:
Ver original+-------------+---------------+
| id_proyecto | descripcion |
+-------------+---------------+
| 1 | PROYECTO UNO |
| 2 | PROYECTO DOS |
| 3 | PROYECTO TRES |
+-------------+---------------+
+---------+-------------+---------------+
| id_pago | id_proyecto | cantidad_pago |
+---------+-------------+---------------+
| 1 | 1 | 10 |
| 2 | 1 | 20 |
| 3 | 1 | 30 |
| 4 | 2 | 40 |
| 5 | 2 | 40 |
| 6 | 3 | 50 |
+---------+-------------+---------------+
+----------+-------------+----------------+
| id_gasto | id_proyecto | cantidad_gasto |
+----------+-------------+----------------+
| 1 | 1 | 15 |
| 2 | 1 | 10 |
| 3 | 2 | 30 |
+----------+-------------+----------------+
ahora bien, cuando unes PROYECTOS con PAGOS sin hacer sumas ni agrupaciones observa el resultado:
Código MySQL:
Ver original -> LEFT JOIN pagos
ON proyectos.id_proyecto
= pagos.id_proyecto
; +-------------+---------------+---------+-------------+---------------+
| id_proyecto | descripcion | id_pago | id_proyecto | cantidad_pago |
+-------------+---------------+---------+-------------+---------------+
| 1 | PROYECTO UNO | 1 | 1 | 10 |
| 1 | PROYECTO UNO | 2 | 1 | 20 |
| 1 | PROYECTO UNO | 3 | 1 | 30 |
| 2 | PROYECTO DOS | 4 | 2 | 40 |
| 2 | PROYECTO DOS | 5 | 2 | 40 |
| 3 | PROYECTO TRES | 6 | 3 | 50 |
+-------------+---------------+---------+-------------+---------------+
Observa que la descripción para cada proyecto SE REPITE EN CADA REGISTRO DE PAGO... ahora observa qué pasa cuando incluyes la tabla de GASTOS:
Código MySQL:
Ver original -> LEFT JOIN pagos
ON proyectos.id_proyecto
= pagos.id_proyecto
-> LEFT JOIN gastos
ON proyectos.id_proyecto
= gastos.id_proyecto
; +-------------+---------------+---------+-------------+---------------+----------+-------------+----------------+
| id_proyecto | descripcion | id_pago | id_proyecto | cantidad_pago | id_gasto | id_proyecto | cantidad_gasto |
+-------------+---------------+---------+-------------+---------------+----------+-------------+----------------+
| 1 | PROYECTO UNO | 1 | 1 | 10 | 1 | 1 | 15 |
| 1 | PROYECTO UNO | 2 | 1 | 20 | 1 | 1 | 15 |
| 1 | PROYECTO UNO | 3 | 1 | 30 | 1 | 1 | 15 |
| 1 | PROYECTO UNO | 1 | 1 | 10 | 2 | 1 | 10 |
| 1 | PROYECTO UNO | 2 | 1 | 20 | 2 | 1 | 10 |
| 1 | PROYECTO UNO | 3 | 1 | 30 | 2 | 1 | 10 |
| 2 | PROYECTO DOS | 4 | 2 | 40 | 3 | 2 | 30 |
| 2 | PROYECTO DOS | 5 | 2 | 40 | 3 | 2 | 30 |
+-------------+---------------+---------+-------------+---------------+----------+-------------+----------------+
observa ahora los ID_PAGOS, estos se duplicaron también tantas veces como gasto existen!!! y entre más tablas sigas uniendo más registros se irán duplicando... ¿QUÉ TIENES QUE HACER, pues cambiar tu relación 1 a muchos a una relación 1 a 1, en otras palabras primero CONSOLIDAR los PAGOS, los GASTOS y los SUELDOS por SEPARADO y después unirlos:
Primero obtienes el total de pagos POR PROYECTO:
Código MySQL:
Ver originalmysql
> SELECT id_proyecto
, SUM(cantidad_pago
) total_pagos
+-------------+-------------+
| id_proyecto | total_pagos |
+-------------+-------------+
| 1 | 60 |
| 2 | 80 |
| 3 | 50 |
+-------------+-------------+
Y haces lo mismo con los gastos:
Código Python:
Ver originalmysql> SELECT id_proyecto, SUM(cantidad_gasto) total_gasto
-> FROM gastos
-> GROUP BY id_proyecto;
+-------------+-------------+
| id_proyecto | total_gasto |
+-------------+-------------+
| 1 | 25 |
| 2 | 30 |
+-------------+-------------+
2 rows in set (0.00 sec)
ahora si, OBSERVA QUE SOLO HAY UN CONCEPTO DE PAGO y UN GASTO por cada proyecto, por lo tanto tu relación es 1 a 1, entonces puedes hacer el LEFT JOIN utilizando estas consultas:
Código MySQL:
Ver originalmysql
> SELECT proyectos.id_proyecto
, proyectos.descripcion
, pagos.total_pagos
, gastos.total_gastos
-> ON proyectos.id_proyecto
= pagos.id_proyecto
-> ON proyectos.id_proyecto
= gastos.id_proyecto
; +-------------+---------------+-------------+--------------+
| id_proyecto | descripcion | total_pagos | total_gastos |
+-------------+---------------+-------------+--------------+
| 1 | PROYECTO UNO | 60 | 25 |
| 2 | PROYECTO DOS | 80 | 30 |
| 3 | PROYECTO TRES
| 50 | NULL | +-------------+---------------+-------------+--------------+
¿Se entiende? dale un vistazo y nos comentas.
Saludos
Leo.