mysql用总和加入3个表给出错误的结果
Posted
技术标签:
【中文标题】mysql用总和加入3个表给出错误的结果【英文标题】:mysql joining 3 tables with sum gives wrong result 【发布时间】:2016-11-19 23:52:13 【问题描述】:我一直在尝试使用 3 张表格制作资产负债表。第一个表是供应商的名称。第二个表是由于供应商,第三个表是对供应商的付款,两者都与供应商表的外键连接。
我期待这样的结果:
供应商名称----------------------到期--------------------- ---------- 付款
名称------------------ 总和(数量*单价) ------------------sum(支付金额)
我的查询是
SELECT
tbl_supplier.supplier_name AS supplier,
SUM(tbl_payment.pay_amount) AS payment,
SUM(tbl_stock.stock_qnt * tbl_stock.stock_up) AS due
FROM
tbl_supplier
INNER JOIN
tbl_payment ON tbl_supplier.id = tbl_payment.supplier_id
INNER JOIN
tbl_stock ON tbl_supplier.id = tbl_stock.supplier_id
GROUP BY supplier_name
但结果是到期金额乘以付款次数,反之亦然。
例如,如果供应商的应付总额为 1000,而他已支付 3 次,则其显示的应付总额为 3000,而不是 1000。
请帮忙。谢谢
【问题讨论】:
你是否真正做到了 DISTINCT? 【参考方案1】:您不能join
股票和付款表。 join
会将tbl_payment
中的每一行与tbl_stock
中的每一行结合起来,因此tbl_payment
中的每一行有3 行,您将得到tbl_stock
中的第一行3 次,然后对这些求和。 Distinct
不是解决方案,因为它会忽略那些不明显的值,例如如果您实际上有 2 笔 100 美元的付款,那么您将有一笔不同的金额为 100 美元(因为 100 美元和 100 美元的价值相同)。
您可以使用子查询分别计算总和(这是 tbl_supplier
与 tbl_payment
和 tbl_supplier
与 tbl_stocks
的隐含 join
,但不是所有三个一起计算):
SELECT
tbl_supplier.supplier_name AS supplier,
(select sum(tbl_payment.pay_amount)
from tbl_payment
where tbl_payment.supplier_id = tbl_supplier.id) as payment,
(select sum(tbl_stock.stock_qnt * tbl_stock.stock_up)
from tbl_stock
where tbl_stock.supplier_id = tbl_supplier.id) as due
from tbl_supplier;
【讨论】:
谢谢 Solarflare。你说的对。 DISTINCT 不是解决方案,因为它不计算多个相同的值。您的代码似乎正在运行。让我检查一下,然后回复你。【参考方案2】:user5599807 建议的解决方案
SELECT DISTINCT
tbl_supplier.supplier_name AS supplier,
SUM(DISTINCT tbl_payment.pay_amount) AS payment,
SUM(DISTINCT tbl_stock.stock_qnt * tbl_stock.stock_up) AS due
FROM
tbl_supplier
INNER JOIN
tbl_payment ON tbl_supplier.id = tbl_payment.supplier_id
INNER JOIN
tbl_stock ON tbl_supplier.id = tbl_stock.supplier_id
GROUP BY supplier_name
【讨论】:
这行不通(至少在一般情况下不行)!如果您多次支付相同的付款金额,例如如果您支付 100 美元、100 美元和 200 美元,您的不同金额将为 300 美元(因为您有不同的(=不同)值 100 美元和 200 美元)。如果您多次订购相同数量的产品,结果相同。您不能连接所有 3 个表,但必须使用子查询。我会添加一个答案。以上是关于mysql用总和加入3个表给出错误的结果的主要内容,如果未能解决你的问题,请参考以下文章