I have 3 tables to calculate payments, received and paid:
- Company
idcompany | company |
---|---|
1 | APPLE |
2 | |
3 | MICROSOFT |
4 | STEAM |
5 | AMAZON |
6 | LG |
- Pay:
id | company | dueday | valuep |
---|---|---|---|
1 | APPLE | 03/10/2022 | 200,00 |
2 | APPLE | 04/10/2022 | 600,00 |
3 | 04/10/2022 | 600,00 | |
4 | MICROSOFT | 04/10/2022 | 500,00 |
5 | MICROSOFT | 04/10/2022 | 60,00 |
6 | APPLE | 04/10/2022 | 100,00 |
3.Receive:
idconta | company | issuedate | valuer |
---|---|---|---|
104 | MICROSOFT | 03/10/2022 | 70000,00 |
106 | STEAM | 03/10/2022 | 15000,00 |
107 | STEAM | 03/10/2022 | 42000,00 |
108 | AMAZON | 03/10/2022 | 46000,00 |
109 | LG | 03/10/2022 | 3200,00 |
I need to make a report with amount paid and received during a certain period, but somehow its duplicating sum and I getting this result:
company | value_pay | value_receive |
---|---|---|
AMAZON | NULL | 46000.00 |
APPLE | 900.00 | NULL |
600.00 | NULL | |
LG | NULL | 3200.00 |
MICROSOFT | 560.00 | 140000.00 |
SHOPPING | NULL | 20000.00 |
STEAM | NULL | 57000.00 |
I tried this query:
SELECT o.company,
SUM(n.valuep) AS value_pay,
SUM(r.valuer) AS value_receive
FROM app_company AS o
LEFT JOIN app_pay AS n ON o.idcompany=n.company AND (date(n.duedate) BETWEEN '2022-10-01' AND '2022-10-30')
LEFT JOIN app_receive AS r ON o.idcompany=r.company AND (date(r.issuedate) BETWEEN '2022-10-01' AND '2022-10-30')
GROUP BY o.company
I tried LEFT JOIN to get all results even if it is empty in one of columns, I tried to pre-aggregate, but I could not get my query to work. I am missing something.
CodePudding user response:
You need to do the aggregation on the subqueries and then join .
SELECT o.company,
value_pay,
value_receive
FROM app_company AS o
LEFT JOIN (select sum(valuep) as value_pay,
company
from app_pay
where date(dueday) BETWEEN '2022-10-01' AND '2022-10-30'
group by company
) AS n ON o.company=n.company
LEFT JOIN (select sum(valuer) AS value_receive ,
company
from app_receive
where date(issuedate) BETWEEN '2022-10-01' AND '2022-10-30'
group by company
) AS r ON o.company=r.company
order by o.company asc ;