【问题标题】:Return Records Based on Condition Comparing Aggregates of Two Child Tables基于条件比较两个子表的聚合返回记录
【发布时间】:2020-11-03 19:25:33
【问题描述】:

我有一个包含许多付款和许多发票行项目的发票表。发票记录的总和是通过发票行项目(数量 * 价格)得出的。

我正在尝试创建一个查询,该查询将返回未结余额的发票。

SELECT inv.id, MAX(inv.invoice_total) as "InvoiceTotal", SUM(pt.amount) AS "TotalPayments" FROM (
  SELECT 
        i.id,
        SUM( ili.price * ili.quantity ) as "invoice_total"
     FROM
        invoices i
        JOIN invoice_line_items ili
          on i.id = ili.invoice_id
  GROUP BY i.id
  ) inv
LEFT JOIN payment_transactions pt
ON pt.invoice_id = inv.id
GROUP BY inv.id
ORDER BY inv.id DESC

最后一点,我想,是添加 HAVING,它只返回 Total Payments 小于 Invoice Total 的记录,但它不起作用。

我怎样才能做到这一点?有比我更简单的方法吗?

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    这应该可行:

    SELECT inv.id, MAX(inv.invoice_total) as InvoiceTotal, SUM(pt.amount) AS "TotalPayments"
    FROM (SELECT i.id, SUM( ili.price * ili.quantity ) as invoice_total
          FROM invoices i JOIN 
               invoice_line_items ili
               ON i.id = ili.invoice_id
          GROUP BY i.id
         ) inv LEFT JOIN
         payment_transactions pt
         ON pt.invoice_id = inv.id
    GROUP BY inv.id
    HAVING COALESCE(SUM(pt.amount), 0) < MAX(inv.invoice_total)
    ORDER BY inv.id DESC;
    

    【讨论】:

    • 快!那么,考虑到设置,必须执行“MAX(inv.invoice_total)”是否正常?我只是觉得不对劲,但话说回来,我不经常做复杂的查询。
    • @karns 。 . .您也可以将其包含在GROUP BY 中。 COALESCE() 对于获得未付款的发票也很重要。
    • 谢谢!不过,我可能需要澄清一下。子查询是一个好方法吗?我认为需要对几个相同的派生值做一个“MAX”指向某个地方的臭味,这意味着我的方法首先是错误的。如果您说这是解决问题的好方法,您的经验可能会增强我的信心。
    • @karns 。 . .我认为您的查询很好。
    猜你喜欢
    • 1970-01-01
    • 2020-03-19
    • 2012-08-25
    • 2019-07-20
    • 1970-01-01
    • 1970-01-01
    • 2016-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多