小编典典

多个联接中的MySQL SUM函数

sql

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

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;

阅读 194

收藏
2021-04-14

共1个答案

小编典典

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

如果“收费”中的一行在“税费”中具有多个对应行,那么您不能简单地联接表而不复制“收费”行。然后,正如您所发现的,对它们进行汇总时,将获得多个副本。

您需要一种方法来获取一个虚拟表(子查询),其中每个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

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

2021-04-14