基于条件比较两个子表的聚合返回记录

Posted

技术标签:

【中文标题】基于条件比较两个子表的聚合返回记录【英文标题】: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 的记录,但它不起作用。

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

【问题讨论】:

【参考方案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 。 . .我认为您的查询很好。

以上是关于基于条件比较两个子表的聚合返回记录的主要内容,如果未能解决你的问题,请参考以下文章

二分查找算法,你真的了解吗?

基于子表的一对多分离条件父表获取

通过比较sql server中同一张表的每条记录返回重复

比较不同表的聚合函数

EF6 Linq 查询。仅包括返回子表的第一个条目

mysql中inner join和outer join有啥区别?