Tengo 3 tablas de la base de la siguiente manera:
proyectos:
id
project_name
project_location
status
project_expenses
id
project_id
expense_category
expense_subcategory
amount
userid
date
payment_status
project_status
project_income
id
project_id
project_income
date
userid
project_status
projects.id, project_expenses.project_id y project_income.project_id están relacionados.
Necesito crear una consulta que muestra PROJECT_ID, Project_Name, SUM de Project_Income, SUM de Project_expenses
Probé la siguiente consulta, pero no obtener resultado correcto.
SELECT p.id AS id, p.project_name AS project_name, SUM(i.project_income) AS income, SUM(e.amount) AS expenses
FROM project_income i, project_expenses e, projects p
WHERE i.project_id = p.id AND e.project_id = p.id AND p.status = 'Active'
GROUP BY id
Tengo actualmente en 2 filas project_income y 4 filas en project_expenses. El resultado es project_income pantallas doble de los valores. Algo está mal con mi JOIN.
Siendo un novato que soy incapaz de entender lo que estoy haciendo mal ?? Solicitando ayuda ...
Utilice sub-selecciona en las columnas de resultados de la consulta. No hay necesidad de GROUP BY
.
SELECT p.id
, p.project_name
, ( SELECT SUM(i.project_income)
FROM project_income i
WHERE i.project_id = p.id
) AS income
, ( SELECT SUM(e.amount)
FROM project_expenses e
WHERE e.project_id = p.id
) AS expenses
FROM projects p
WHERE p.status = 'Active'
El problema con la consulta en la pregunta se explica mejor con un ejemplo.
Usted dice que hay 2 filas project_income
y 4 filas en project_expenses
. Digamos que los ingresos 2 son 1000 y 1500, y los gastos son 4 615, 750, 840, y 900.
Dado que no existen restricciones entre ellos, lo que significa que obtendrá la combinación cruzada, es decir, 8 registros:
income expense
1000 615
1000 750
1000 840
1000 900
1500 615
1500 750
1500 840
1500 900
Ahora, cuando usted resume income
a obtener 4 veces el valor que desee, y cuando usted resume el gasto se obtiene 2 veces el valor que desee.