基于条件比较两个子表的聚合返回记录
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 。 . .我认为您的查询很好。以上是关于基于条件比较两个子表的聚合返回记录的主要内容,如果未能解决你的问题,请参考以下文章