在我的應用程序中,Invoice has_many item_numbers
和Invoice has_many payments
。每張發票都有一個餘額,它是ItemNumber金額屬性的總和,減去付款金額屬性的總和。通過兩個「has_many」子表的總和來排序查詢?
發票模型中的餘額很容易計算,但我試圖編寫一個查詢來平衡發票排序,這在ActiveRecord/SQL中很難做到。
我成功設法訂單上的總ITEM_NUMBERS與下面的查詢(感謝丹尼爾Rikowski)發票:
Invoice.where(user_id: 1, deleted: false, status: 'Sent')
.joins(:item_numbers)
.select('invoices.*, sum(item_numbers.amount)')
.group('invoices.id')
.order('sum(item_numbers.amount) asc')
.limit(20)
我曾試圖擴大這種通過下面的平衡命令;
Invoice.where(user_id: 1, deleted: false, status: 'Sent')
.joins(:item_numbers)
.joins("FULL OUTER JOIN payments ON payments.invoice_id = invoices.id")
.select("invoices.*, sum(item_numbers.amount_with_gst) - COALESCE(sum(payments.amount), 0)")
.group("invoices.id")
.order("sum(item_numbers.amount_with_gst) - COALESCE(sum(payments.amount), 0) #{dir}")/
該查詢有兩個問題。首先,它非常醜陋,其次,它不起作用。由於並非所有發票都有付款,並且如果我僅使用聯合(:付款),所以我在付款表上使用了完整的外部聯接,因此從結果中排除了沒有付款的任何發票。聯盟被放置在那裏來處理零金額。
查詢接近,但說有3個item_numbers和1個付款(一個非常典型的情況),付款金額將減去3次,導致餘額遠小於實際金額(通常爲負餘額) 。
這可能很清楚我的深度。我爲這個查詢付出了很多努力(大約4個小時的閱讀和失敗的嘗試),並不能完全明白它。我的數據庫是PostgreSQL。
這個功能非常完美,並且具有令人愉快理解的額外優勢。我甚至修改了一些現有的搜索查詢以相同的方式排序。 .group('invoices.id')似乎不再是必要的,但(可能是因爲沒有連接)。謝謝。 – brad
@brad:請注意,對於結果中的多個行,相關的子查詢通常比我演示的(''LEFT')'JOIN'慢得多。有人甚至稱這是一種反模式。用['EXPLAIN ANALYSE']測試不同之處(http://www.postgresql.org/docs/current/interactive/sql-explain.html)。 –
謝謝你的擡頭。我會做更多的調查。我的數據庫非常小,我的查詢也很小,所以它不應該影響我太多(現在....)。 – brad