gpt4 book ai didi

多个连接中的 MySQL SUM 函数

转载 作者:行者123 更新时间:2023-11-29 04:36:28 25 4
gpt4 key购买 nike

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

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 笔税费,那么当我使用 SUM 函数时,它会计算两次收费金额,例如,如果显示 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;

最佳答案

您想知道是否可以在没有子查询的情况下做到这一点。 不,你不能。

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

然后您可以将该子查询连接到您的客户表以按客户汇总销售额。

关于多个连接中的 MySQL SUM 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40323925/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com