我有一個模式,它看起來像以下:如何通過比較子表上沒有子查詢的兩個總和來選擇行?
Invoices: | id | ... |
InvoicePayments: | id | invoice_id | amount_cents | ... |
LineItems: | id | invoice_id | unit_price_cents | quantity | ... |
,我期待找到未付發票,也就是說,誰擁有amount_cents的總和從InvoicePayments小於(數量的總和發票* unit_price)來自LineItems。我能夠用兩個子查詢做到這一點,如:
SELECT prices.id FROM (
SELECT invoices.id, sum(invoice_payments.amount_cents) as paid
FROM invoices
LEFT JOIN invoice_payments ON invoice_payments.invoice_id = invoices.id
GROUP BY invoices.id
) payments JOIN (
SELECT invoices.id, sum(line_items.quantity * line_items.unit_price_cents) as price
FROM invoices
LEFT JOIN line_items ON line_items.invoice_id = invoices.id
GROUP BY invoices.id
) prices
ON payments.id = prices.id
WHERE paid < price OR paid IS NULL;
不過,我使用ActiveRecord,想簡單的東西,可轉化成阿雷爾報表;此外,我希望將此用作可重用範圍,因此可以通過篩選出比該日期更新的InvoicePayments來應用其他約束,例如查找在某個日期未付的發票。
是否有一種方法可以在沒有子查詢的情況下完成此操作,以便我可以更輕鬆地使用Rails並應用靈活的過濾器?