嗨,这是我的情况,我有那些桌子
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;
您想知道是否可以在没有子查询的情况下执行此操作。 不,你不能。
如果“收费”中的一行在“税费”中具有多个对应行,那么您不能简单地联接表而不复制“收费”行。然后,正如您所发现的,对它们进行汇总时,将获得多个副本。
您需要一种方法来获取一个虚拟表(子查询),其中每个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
然后,您可以将该子查询加入到“客户”表中,以按客户汇总销售额。