mysql求和函数

3j86kqsm  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(279)

嗨,这是我的案子我有那些table

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美元的费用,而不是我对该费用收取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;
ni65a41a

ni65a41a1#

您想知道是否可以在没有子查询的情况下执行此操作。不,你不能。
如果charges中的一行有多个对应的tax行,则不能简单地联接表而不复制charges行。然后,正如你所发现的,当你总结它们时,你会得到多个副本。
您需要一种方法来获得一个虚拟表(一个子查询),其中每项费用只有一行。

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表以按客户汇总销售。

cx6n0qe3

cx6n0qe32#

这是一个痛苦,因为多层次。我建议:

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;

如果一个客户有多个费用,或者一个费用有多个税,那么如果没有一个表单或另一个表单的子查询,您将无法修复此问题。

相关问题