【问题标题】:Two left outer joins not summing correctly两个左外连接未正确求和
【发布时间】:2015-02-15 18:32:39
【问题描述】:

我试图有 2 个 LEFT JOINS,对结果求和,然后从另一个中减去一个总和。一个是正​​确求和,但是当我放置两个连接时,其中一个没有正确求和。


    SELECT
    j.jobNumber, j.customerID, j.costDelivery, j.costCallout, j.costLabour , 
    c.customerID, c.firstName, c.lastName , 
    IFNULL(sum(jp.amount),0) AS Total_Paid , 
    IFNULL(j.costDelivery,0) + IFNULL(j.costCallout,0) + IFNULL(j.costLabour,0) + IFNULL(sum(p.unitPrice*p.quantity),0) AS Total_Cost
    FROM s_jobcards AS j 
    INNER JOIN s_customers AS c ON j.customerID = c.customerID 
    LEFT OUTER JOIN s_payments AS jp ON j.jobNumber = jp.jobNumber 
    LEFT OUTER JOIN s_partOrders AS p ON j.jobNumber = p.jobNumber
    GROUP BY j.jobNumber
    HAVING Total_Cost > Total_Paid

Total_Paid 列说明jp.amount 的总和不正确。但是,Total_Cost 总和正确。有什么想法吗?

【问题讨论】:

  • 这是一个无效的 SQL 语句。 (MySQL 做了一些不可预知的技巧...)一般的 GROUP BY 规则是:如果指定了 GROUP BY 子句,则 SELECT 列表中的每个列引用必须标识一个分组列或者是一个集合函数的参数!
  • ...在核心表的pk上分组时例外。
  • 如果您愿意,请考虑遵循以下简单的两步操作: 1. 如果您还没有这样做,请提供适当的 DDL(和/或 sqlfiddle),以便我们可以更轻松地复制问题。 2. 如果您尚未这样做,请提供与步骤 1 中提供的信息相对应的所需结果集。
  • @Strawberry,真的!但是,我的建议仍然是遵循一般规则 - 这样你就不会搞砸了。

标签: mysql sql select join left-join


【解决方案1】:

试试这个:

SELECT j.jobNumber, j.customerID, j.costDelivery, j.costCallout, j.costLabour, 
       c.customerID, c.firstName, c.lastName, IFNULL(jp.payment, 0) AS Total_Paid , 
      (IFNULL(j.costDelivery, 0) + IFNULL(j.costCallout, 0) + IFNULL(j.costLabour, 0) + IFNULL(p.cost, 0)) AS Total_Cost
FROM s_jobcards AS j 
INNER JOIN s_customers AS c ON j.customerID = c.customerID 
LEFT OUTER JOIN (SELECT jp.jobNumber, SUM(jp.amount) payment 
                 FROM s_payments AS jp 
                 GROUP BY jp.jobNumber
               ) AS jp ON j.jobNumber = jp.jobNumber 
LEFT OUTER JOIN (SELECT p.jobNumber, SUM(p.unitPrice * p.quantity) cost 
                 FROM s_partOrders AS p 
                 GROUP BY p.jobNumber
               ) AS p ON j.jobNumber = p.jobNumber 
GROUP BY j.jobNumber
HAVING Total_Cost > Total_Paid;

【讨论】:

  • 请注意,COALESCE 符合标准。它也更漂亮、更灵活。
  • 这看起来应该可以正常工作,但是解释为什么它有效而 OP 没有提供更好的答案。
  • 这完美!谢谢你的协助。我实际上正在考虑这样做,但没有像我认为的那样给出相同的结果。你能解释为什么它不同吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-03
相关资源
最近更新 更多