Obě tabulky můžete spojit, agregovat podle faktury a použít sum()
pro výpočet celkové platby. Nakonec case
výraz lze použít k zobrazení stavu:
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
Poznámky:
-
left join
umožňuje faktury bez jakékoli platby v daném období. -
Použil jsem stejné datové filtry jako ve vašich původních dotazech, ale trochu jsem je optimalizoval tak, že jsem je přepnul na polootevřené intervaly.
-
Nezdá se, že byste potřebovali tabulku
invoicestatus
abyste dosáhli požadovaného výsledku.