Vous pouvez joindre les deux tables, agréger par facture et utiliser sum()
pour calculer le paiement total. Enfin, un case
l'expression peut être utilisée pour afficher le statut :
select i.invoiceid, i.clientname, i.invoicetotal,
coalesce(sum(p.PaymentReceivedAmount), 0) as paymenttotal,
case when i.invoicetotal <=> sum(p.PaymentReceivedAmount) then 'In Full' else 'Partial Payment' end as paymentstatus
from invoices i
left join payment p
on p.invoiceid = i.invoiceid
and p.paymentreceiveddate >= '2019-01-01' and p.paymentreceiveddate < '2020-01-01'
where
i.invoicedate >= '2019-01-01' and i.invoicedate < '2020-01-01'
and i.invoicestatus in (1, 2)
and (i.invoiceactive <> 0 or i.invoiceactive is null)
group by i.invoiceid
order by clientname
Remarques :
-
La
left join
autorise les factures sans aucun paiement dans la période. -
J'ai utilisé les mêmes filtres de date que dans vos requêtes d'origine, mais je les ai légèrement optimisés en les transformant en intervalles semi-ouverts.
-
Il ne semble pas que vous ayez besoin de la table
invoicestatus
pour obtenir le résultat souhaité.