Postgres:多个联接的总和导致值超出预期

我有3个表格:发票,发票付款,发票信用注释。我想获取所有总付款额少于发票表中grand_total金额的发票。

发票模型

has_many :invoice_payments
has_many :invoice_credit_notes

在发票付款模式中

belongs_to :invoice

在invoice_credit_notes模型中

belongs_to :invoice

invoice_payments中有amountdiscount字段。

invoice_credit_notes中包含amount字段。

这是我想出的:

scope :unpaid,->{left_outer_joins(:invoice_payments,:credit_note_invoices)
                  .having('(COALESCE(SUM(invoice_payments.amount + invoice_payments.discount),0) + COALESCE(SUM(credit_note_invoices.amount),0)) < ROUND(invoices.grand_total,0)')
                  .group('invoices.id')}

但是我的解决方案存在问题,因为可能有多个invoice_payments或invoice_credit_notes (COALESCE(SUM(invoice_payments.amount + invoice_payments.discount),0) + COALESCE(SUM(invoice_credit_notes.amount),0)返回的金额高于实际支付的金额。这很可能是因为要联接多个表。

那么,如何克服这个问题?

cxiaoyangcxiaoyang 回答:Postgres:多个联接的总和导致值超出预期

该语句生成此(简体)查询:

select sum(p.amount+ p.discount)+ sum(n.amount)
from invoice i
left join invoice_payments p on p.invoice_id = i.id
left join invoice_credit_notes n on n.invoice_id = i.id
group by i.id;

两个联接使用相同的invoice_payments创建invoice_credit_notesinvoice_id中所有行的笛卡尔积,因此amounts被多次求和。您应该在单独的派生表(子查询)中计算合计:

select p.sum+ n.sum
from invoice i
left join (
    select invoice_id,sum(amount+ discount)
    from invoice_payments
    group by invoice_id
    ) p on p.invoice_id = i.id
left join (
    select invoice_id,sum(amount)
    from invoice_credit_notes
    group by invoice_id
    ) n on n.invoice_id = i.id

我希望您可以轻松地将其翻译为红宝石。

,

您可以在row_number()的{​​{1}}中使用它。然后对行号为1的字段求和。

本文链接:https://www.f2er.com/3144749.html

大家都在问