多个连接中的 MySQL SUM 函数

G.L*_*G.L 2 mysql sql join

嗨,这是我的情况,我有那些桌子

Customer {id,name}
Charges {id,amount,customer_id}
Taxes {id,amount,charge_id}
Run Code Online (Sandbox Code Playgroud)

所以我想总结费用和税费,然后按客户 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;
Run Code Online (Sandbox Code Playgroud)

因此,如果我对客户收取 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;
Run Code Online (Sandbox Code Playgroud)

O. *_*nes 5

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

如果 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
Run Code Online (Sandbox Code Playgroud)

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