嗨,这是我的案子我有那些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;
2条答案
按热度按时间ni65a41a1#
您想知道是否可以在没有子查询的情况下执行此操作。不,你不能。
如果charges中的一行有多个对应的tax行,则不能简单地联接表而不复制charges行。然后,正如你所发现的,当你总结它们时,你会得到多个副本。
您需要一种方法来获得一个虚拟表(一个子查询),其中每项费用只有一行。
然后可以将该子查询联接到customer表以按客户汇总销售。
cx6n0qe32#
这是一个痛苦,因为多层次。我建议:
如果一个客户有多个费用,或者一个费用有多个税,那么如果没有一个表单或另一个表单的子查询,您将无法修复此问题。