Mysql 查询 : LEFT JOIN List all orders and "balance due" for a customer, 如果没有订单,则列出客户。 3 table

标签 mysql sql join left-join inner-join

我有一个客户表、订单表和付款表。

从这些中,我试图获取一个包含每条记录的表:客户#、订单#、应付余额。但如果客户没有订单,那么我只想列出客户#,其他字段的值为 NULL。

使用 LEFT JOIN,我可以仅使用客户#和订单#来完成此操作,但我也无法弄清楚如何获得其中的余额。我对 Mysql 相当陌生,尝试搜索答案但找不到。

以下内容仅适用于客户#和订单#:

SELECT
    customers.cust_num,
    orders.order_id
FROM customers
LEFT JOIN orders ON customers.cust_num = orders.cust_num

但我正在尝试将“orders.invoice_amount - SUM( payments.amount) AS Balance_due”合并为另一列,其中付款表通过两者中名为“order_id”的字段与订单表相关。

也许是这样的: 从付款、订单中选择订单.invoice_amount - SUM(付款.金额)作为balance_due,其中付款.order_id = 订单.order_id

知道我该如何去做或指出正确的方向吗?

最佳答案

执行额外的 LEFT JOIN,但针对按订单分组的付款进行子查询。因此,如果它在预查询结果中找到一条记录,那么就可以开始了。另外,我更改为使用表“别名”以缩短可读性,特别是当表名称很长,或者您必须在查询中多次联接到同一个表时。

SELECT
      c.cust_num,
      coalesce( o.order_id, 0 ) as Order_ID,
      coalesce( o.invoice_amount, 0 ) as InvoiceAmount,
      coalesce( Prepaid.TotalPaid, 0 ) as TotalPaid,
      coalesce( o.invoice_amount - coalesce( PrePaid.TotalPaid, 0 ), 0) as BalanceDue
   FROM 
      customers c
         LEFT JOIN orders o 
            ON c.cust_num = o.cust_num
            LEFT JOIN
            ( select 
                    p.order_id,
                    sum( p.amount ) as totalPaid
                 from
                    payments p
                 group by
                    p.order_id ) as PrePaid
               on o.order_id = PrePaid.order_id

关于Mysql 查询 : LEFT JOIN List all orders and "balance due" for a customer, 如果没有订单,则列出客户。 3 table ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37791335/

相关文章:

java - 是否可以合并四个不同的 MySQL 查询以及中间的 if 条件以避免 java 代码?

MySQL按总和连接表问题

php - 如何更新codeigniter中的图像?

mysql - 按日期排序,直到达到特定日期,然后按 id DESC 排序

mysql - 从数据库显示

mysql - 选择薪水高于其部门平均水平的每位员工

php - 将 Access SQL 转换为 MySQL

Mysql在表上加入两次

c# - 如何将数字添加到 Sqlcommand.Parameters?

r - 为什么 data.tables 的 X[Y] 连接不允许完全外连接或左连接?