【问题标题】:Mysql Query: LEFT JOIN List all orders and "balance due" for a customer, if no orders, just list customer. 3 TablesMysql Query: LEFT JOIN 列出一个客户的所有订单和“余额”,如果没有订单,只列出客户。 3 表
【发布时间】:2016-06-13 13:40:46
【问题描述】:

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

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

使用 LEFT JOIN,我可以只用 customer# 和 order# 来做到这一点,但我也不知道如何在那里获得应付的余额。我对 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”的字段与订单表相关。

也许是这样的: SELECT orders.invoice_amount - SUM(payments.amount) AS balance_due FROM payments, orders WHERE payments.order_id = orders.order_id

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

【问题讨论】:

  • 如果您愿意,请考虑遵循以下简单的两步操作: 1. 如果您还没有这样做,请提供适当的 CREATE 和 INSERT 语句(和/或 sqlfiddle),以便我们可以更容易复制问题。 2. 如果您尚未这样做,请提供与步骤 1 中提供的信息相对应的所需结果集。

标签: mysql sql join left-join inner-join


【解决方案1】:

做一个额外的 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 不支持在 FROM 子句中包含子查询的 SELECT 语句 :( 所以我读到我可以创建两个不同的视图并组合成一个视图,但这会降低性能。你知道我会怎么做吗?这样做明智吗?
  • @silent_john,显然每次都针对整个数据库可能是一个问题,但是您希望如何/什么标准来限制它...特定客户,那些在去年, ???这可能只是在可能的附加索引的帮助下战略性地设置了额外的“位置”标准。
【解决方案2】:

你可以试试

SELECT
    customers.cust_num,
    orders.order_id, 
      orders.invoice_amount - SUM(payments.amount)
FROM customers
LEFT JOIN orders ON customers.cust_num = orders.cust_num
INNER JOIN payments P ON P..order_id = orders.order_id
group by cust_num,order_id,orders.invoice_amount

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-01
    • 2020-06-22
    • 1970-01-01
    • 2020-08-29
    • 1970-01-01
    • 2013-02-16
    相关资源
    最近更新 更多