Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL-Select- und IF()-Anweisung

Sie können beide Tabellen verknüpfen, nach Rechnung aggregieren und sum() verwenden um die Gesamtzahlung zu berechnen. Zum Schluss noch ein case Ausdruck kann verwendet werden, um den Status anzuzeigen:

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

Hinweise:

  • Der left join ermöglicht Rechnungen ohne Zahlung im Zeitraum.

  • Ich habe dieselben Datumsfilter wie in Ihren ursprünglichen Abfragen verwendet, sie jedoch ein wenig optimiert, indem ich sie auf halboffene Intervalle umgestellt habe.

  • Anscheinend brauchen Sie die Tabelle invoicestatus nicht um das gewünschte Ergebnis zu erzielen.