Bạn có thể kết hợp cả hai bảng, tổng hợp theo hóa đơn và sử dụng sum()
để tính toán tổng số tiền thanh toán. Cuối cùng, một case
biểu thức có thể được sử dụng để hiển thị trạng thái:
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
Ghi chú:
-
left join
cho phép xuất hóa đơn mà không cần thanh toán trong kỳ. -
Tôi đã sử dụng các bộ lọc ngày tương tự như trong các truy vấn ban đầu của bạn, nhưng đã tối ưu hóa nó một chút bằng cách chuyển nó thành các khoảng thời gian nửa mở.
-
Có vẻ như bạn không cần bảng
invoicestatus
để đạt được kết quả bạn muốn.