Mysql
 sql >> Base de données >  >> RDS >> Mysql

Instruction MySQL Select et IF()

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é.