Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Instrução MySQL Select e IF()


Você pode juntar as duas tabelas, agregar por fatura e usar sum() para calcular o pagamento total. Finalmente, um case expressão pode ser usada para exibir o status:
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

Notas:

  • A left join permite faturas sem qualquer pagamento no período.

  • Usei os mesmos filtros de data das suas consultas originais, mas otimizei um pouco, transformando-o em intervalos semi-abertos.

  • Não parece que você precisa da tabela invoicestatus para alcançar o resultado desejado.