【问题标题】:MySQL SUM function in multiple joins多个连接中的 MySQL SUM 函数
【发布时间】:2016-10-29 21:37:02
【问题描述】:

嗨,这是我的情况,我有这些表

Customer {id,name}
Charges {id,amount,customer_id}
Taxes {id,amount,charge_id}

所以我想对费用和税金进行求和,然后按客户 ID 分组这是我的查询

SELECT SUM(ch.amount),SUM(t.amount)
FROM Customer c
LEFT JOIN Charges ch ON ch.customer_id = c.id
LEFT JOIN Taxes t ON t.charge_id = ch.id
GROUP BY c.id;

因此,如果我对客户收取 1 笔费用,而不是使用 SUM 函数收取的 2 笔税款,它会计算两次费用金额,例如,如果显示 10 美元,它会显示 20 美元

我知道如何通过子查询来解决这个问题,但我想知道是否有任何选项可以在没有子查询的情况下获得正确的值,例如我在上面使用的查询,我可以在那里修改来解决这个问题。

谢谢!

没有子查询的更新答案

SELECT
  SUM(CASE WHEN @ch_id != ch.id
    THEN ch.amount END) AS ch_amount,
  SUM(t.amount)         AS t_sum,
  c.*,
  @ch_id := ch.id
FROM
  Customer c
  LEFT JOIN charges ch ON c.id = ch.reservation_id
  LEFT JOIN taxes t ON ch.id = t.charge_id
GROUP BY rs.id;

【问题讨论】:

    标签: mysql sql join


    【解决方案1】:

    您想知道是否可以在没有子查询的情况下执行此操作。 不,你不能。

    如果 Charges 中的一行在 Taxes 中有多个对应的行,则不能简单地连接表而不复制 Charges 行。然后,正如你所发现的,当你总结它们时,你会得到多个副本。

    您需要一种方法来获取一个虚拟表(子查询),其中每个 Charge 有一行。

                        SELECT ch.customer_id,
                               ch.amount amount,
                               tx.tax tax
                          FROM Charges
                          LEFT JOIN (  
                                      SELECT SUM(amount) tax,
                                             charge_id 
                                        FROM Taxes
                                       GROUP BY charge_id
                              ) tx ON ch.id = tx.charge_id
    

    然后,您可以将该子查询加入到您的客户表中,以按客户汇总销售额。

    【讨论】:

      【解决方案2】:

      这很痛苦,因为有多个层次结构。我建议:

      SELECT c.id, ch.charge_amount, ch.taxes_amount
      FROM Customer c LEFT JOIN
           (SELECT ch.customer_id, SUM(ch.amount) as charge_amount,
                   SUM(t.taxes_amount) as taxes_amount
            FROM Charges ch LEFT JOIN
                 (SELECT t.charge_id, SUM(t.amounts) as taxes_amount
                  FROM taxes t
                  GROUP BY t.charge_id
                 ) t
                 ON t.charge_id = ch.id
            GROUP BY ch.customer_id
           ) ch
           ON ch.customer_id = c.id;
      

      如果对客户有多项费用或一项费用有多项税费,那么如果没有一种或另一种形式的子查询,您将无法解决此问题。

      【讨论】:

        猜你喜欢
        • 2012-12-16
        • 1970-01-01
        • 2023-04-08
        • 1970-01-01
        • 2013-05-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多