Ik word wel eens geconfronteerd met dit soort vragen. Door meerdere joins worden waarden van een bepaalde tabel gedupliceerd, verdrievoudigd enz. Om dit op te lossen, doe ik normaal gesproken een kleine hack door de som te delen (op een bepaalde tabel ) door het aantal verschillende ID('s) van de andere tafel. Dit negeert het effect van meerdere duplicaten.
Probeer de volgende zoekopdracht:
select i.id,
(sum(pr.amount * pr.quantity) / IF(count(distinct pm.id) > 0, count(distinct pm.id), 1) as productAmount,
(sum(pm.amount) / IF(count(distinct pr.id) > 0, count(distinct pr.id), 1) as paymentAmount
from invoices as i
left join products as pr on pr.invoice_id=i.id
left join payments as pm on pm.invoice_id=i.id
group by i.id