MYSQL SELECT结果HAVING Balance from Sum of two tables two columns

fykwrbwg  于 2023-05-16  发布在  Mysql
关注(0)|答案(1)|浏览(111)

我有3个数据库表命名为Order_summary,Invoices,Payments
订单_摘要
| 身份证|order_ref|客户参考|
| --------------|--------------|--------------|
| 1| 10055|十五岁|
| 二|10056|二十四|
| 三|10057|二十六|
发票
| 身份证|order_ref|项目|速率|数量|
| --------------|--------------|--------------|--------------|--------------|
| 1| 10055|检测项目|一百|两点|
| 二|10055|检测项目|50块|一点|
| 三|10055|检测项目|两百|一点|
| 四个|10055|检测项目|六十五|三点|
| 五|10056|检测项目|十点|十点|
| 六|10056|检测项目|1065|两点|
| 七|10057|检测项目|560|六点|
| 八|10057|检测项目|十五点|一点|
| 九|10057|检测项目|六五二|两点|
| 10个|10057|检测项目|一百二十五|一点|
付款方式
| 身份证|order_ref|金额|参考文献|方法|
| --------------|--------------|--------------|--------------|--------------|
| 1| 10055| 50块|sds56s|现金|
| 二|10055|一百|21sdas|卡片|
| 三|10056|一千一百六十五点|54asdf|现金|
| 四个|10055|一百五十|asd5a|现金|
| 五|10057|五千|sd6fa|现金|
这里的表格内容不是真实的。结构是这样的。
当SUM(Invoices.rateqty)-(subtract)SUM(Payments.amount)时,我想JOIN返回到Order_summary表,该表大于零。
简单地说,我想过滤未完全支付的发票。
Order_summary中的order_ref列唯一。没有多个。发票中order_ref列有多个。付款中的order_ref列有多个。
结果应该如下所示。
| 身份证|order_ref|发票总额|付款总额|天平|
| --------------|--------------|--------------|--------------|--------------|
| 1| 10055| 645美元|三百|345|
| 二|10056| 2230.00|一千一百六十五点|1065|
|
***| 10057| 4804.00|五千| -196.00 |

  • 最后一个结果行不应出现在结果中。因为余额小于零。(发票已付)。

有人能帮我一下吗。我试过几个左关节和凝聚,但我没有成功。

SELECT os.*,
       COALESCE(SUM(i.rate * i.qty), 0) AS invoice_total,
       COALESCE(SUM(p.amount), 0) AS payment_total,
       COALESCE(SUM(i.rate * i.qty), 0) - COALESCE(SUM(p.amount), 0) AS balance
FROM Order_summary os
LEFT JOIN invoices i ON i.order_ref = os.order_ref
LEFT JOIN Payments p ON p.order_ref = os.order_ref
GROUP BY os.order_ref

尝试了这个和SUM(付款。金额)和SUM(发票。率 * 发票。数量)列显示非常大的值是不正确的。

ma8fv8wu

ma8fv8wu1#

下面的代码工作。我终于找到了解决办法。

SELECT Order_summary.order_ref, Customers.displayName, PaymentSum.SumOfPaymentAmount, InvoiceItemSum.SumOfAmount, SUM(InvoiceItemSum.SumOfAmount-PaymentSum.SumOfPaymentAmount) AS balance
FROM Order_summary
INNER JOIN Customers
  ON Customers.id = Order_summary.customer_ref
INNER JOIN (
    SELECT order_ref, SUM((rate-lineDisc)*qty) AS SumOfAmount
    FROM invoices
    GROUP BY invoices.order_ref) InvoiceItemSum
  ON InvoiceItemSum.order_ref = Order_summary.order_ref
INNER JOIN (
    SELECT order_ref, SUM(amount) AS SumOfPaymentAmount
    FROM Payments
    GROUP BY Payments.order_ref) PaymentSum
  ON PaymentSum.order_ref = Order_summary.order_ref
GROUP BY Order_summary.order_ref
HAVING balance <= 0

相关问题