【问题标题】:Query returning wrong value when doing an INNER JOIN?执行 INNER JOIN 时查询返回错误值?
【发布时间】:2019-01-23 15:32:54
【问题描述】:

我想加入三个表来计算某个 (party_id) 的余额 = (purchase - payment):

  • 派对(party_id、类型、名称)
  • 采购(purchase_id、supplier_id、数量、费率、总计)
  • 付款(payment_id、party_id、金额)

从该 id 购买的总金额 = 20,000,其总付款 = 15,000,因此其余额应为 = 5,000。使用此代码后:

SELECT 
    ((sum(purchase.total)) - (sum(payments.amount))) AS Party_Balance 
FROM 
    Purchase 
INNER JOIN 
    Party 
    ON purchase.supplier_id = party.party_id 
INNER JOIN 
    Payments 
    ON party.party_id = payments.party_id 
WHERE 
    payments.party_id = enter_party_id;

输出不正确:1,000,245 而不是 5,000。

这就是我建立关系的方式,是否存在应该修复的关系?

【问题讨论】:

  • 哪个ID? WHERE 子句或其他地方没有 id。所以你已经包括了每一次购买。尝试选择所有列(用于测试),它应该更清晰。
  • 问题是与这些实体相关的基数是什么。假设您有很多购买付款,那么购买总额会出现多次,并且 sum 函数将返回错误的数字。我建议你 select * 以了解 sum 实际处理的内容。
  • 付款和购买都是与各方关系的多方面。这就是数据集如此庞大的原因。您应该执行两个聚合查询来汇总 Payments 和 Purchases GROUP BY party_id 和 supplier_id,然后将它们加入各方。
  • 感谢您的回复。我select * 每条记录输出23次!这解释了输出中的大值,但现在我该如何解决这个问题?什么在复制它们?

标签: sql ms-access ms-access-2016


【解决方案1】:

您必须对表 Party 进行 2 个单独的分组:
第一次使用Purchase 获得totalSUM
第二个用Payments 得到amountSUM
然后加入2个子查询,得到Party_Balance

SELECT pur.party_id,  pur.total - pay.sumamount AS Party_Balance FROM (
  SELECT Party.party_id, SUM(Purchase.total) AS total
  FROM Party INNER JOIN Purchase ON Party.party_id = Purchase.supplier_id
  GROUP BY Party.party_id
) AS pur
INNER JOIN (
SELECT Party.party_id, SUM(amount) AS sumamount
  FROM Party INNER JOIN Payments ON Party.party_id = Payments.party_id
  GROUP BY Party.party_id
) AS pay
on pay.party_id = pur.party_id

【讨论】:

    猜你喜欢
    • 2016-06-19
    • 2014-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-26
    • 1970-01-01
    • 2021-06-22
    相关资源
    最近更新 更多