sql >> Databasteknik >  >> RDS >> Mysql

MySQL Select och IF() uttalande

Du kan gå med i båda tabellerna, aggregera efter faktura och använda sum() för att beräkna den totala betalningen. Slutligen ett case uttryck kan användas för att visa 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

Anmärkningar:

  • left join tillåter fakturor utan betalning under perioden.

  • Jag använde samma datumfilter som i dina ursprungliga frågor, men optimerade det lite genom att ändra det till halvöppna intervaller.

  • Det verkar inte som att du behöver tabellen invoicestatus för att uppnå det resultat du vill ha.




  1. postgresql-fel PANIC:kunde inte hitta en giltig kontrollpunktspost

  2. Transaktionsisolering i PostgreSQL

  3. Millisekunder i min DateTime ändras när den lagras i SQL Server

  4. MySQL-partitionering / sönderdelning / delning - vilken väg ska jag gå?