MySQL SUM功能在多个连接中

时间:2016-10-29 21:37:03

标签: mysql sql join

嗨,所以这是我的情况我有那些表

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;

所以,如果我使用SUM函数给客户收取1笔费用而不是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;

2 个答案:

答案 0 :(得分:3)

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

如果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

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

答案 1 :(得分:1)

由于多个层次结构,这很痛苦。我建议:

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;

如果客户收取多笔费用或收取多项税费,您将无法在没有某种形式的子查询的情况下解决此问题。