【问题标题】:Joining 2 Many-To-Many Relationship Tables连接 2 个多对多关系表
【发布时间】:2019-08-22 00:49:39
【问题描述】:

问题:

求每个客户的总订单金额和总付款的净余额。

涉及 4 个表:OrderDetailsOrdersPaymentsCustomer

订单总量=订单数量*单价[in OrderDetails]

总付款=同一订单不同付款的总和。

Customers 链接到 PaymentsOrdersCustomerNumberOrders 通过OrderNumber 链接到OrderDetails

我尝试使用 INNER JOIN 函数连接 4 个表。

SELECT
    c.customername, 
    SUM(od.quantityordered * od.priceeach) - SUM(p.amount) AS Net_Balance
FROM 
    (
        (
            orderdetails od 
            INNER JOIN orders o ON od.ordernumber = o.ordernumber
        )  
        INNER JOIN customers c ON o.customernumber = c.customernumber
    )      
    INNER JOIN payments p ON c.customernumber = p.customernumber
GROUP BY c.customername;

几乎所有客户的预期结果都应该是 0。

但是,我得到的是订单总额和支付总额乘以一些常数。具体来说,显示的总付款乘以每个订单的付款次数。

有人有什么办法可以救我一命吗?

【问题讨论】:

  • 发生的情况是您将订单头寸与客户付款相结合。但它们的共同点是它们所指的顺序。单笔付款与单笔订单头寸无关。您真正想要做的是将客户的订单总额(通过汇总订单的头寸获得)与客户的付款(通过汇总付款获得)。请参阅 GMB 对此的回答。
  • 为什么你在接受答案后删除了大部分问题的内容?我回滚到以前的版本。
  • 请在代码问题中给出minimal reproducible example--剪切&粘贴&可运行代码加上所需的输出加上清晰的规范和解释。最小意味着将最少的问题代码添加到最少的工作代码中。因此,给出您所展示的最少代码可以满足您的期望,并且在您出错的第一个地方提供最少的代码。 (调试基础。)
  • 这是一个常见问题解答。在考虑发布之前,请始终使用谷歌搜索您的错误消息或您的问题/问题/目标的许多清晰、简洁和准确的措辞,有或没有您的特定字符串/名称,并阅读许多答案。如果您发布问题,请使用一个短语作为标题。请参阅How to Ask 和投票箭头鼠标悬停文本。 PS 这似乎是一个常见的错误,人们希望加入一些聚合(每个都可能涉及加入),但他们错误地尝试先进行所有的加入,然后再进行所有的聚合。 PS Googe 'site:stackoverflow.com sql 多个聚合是错误的'--很多点击。

标签: sql ms-access many-to-many nested-queries


【解决方案1】:
SELECT c.customername, SUM(od.quantityordered*od.priceeach) as ordersum ,  SUM(p.amount) as paymentsum' 

这两列的结果是什么?
是你想要的吗?

【讨论】:

    【解决方案2】:

    这是处理 N-M 关系时的典型问题。为了解决这个问题,一种解决方案是将聚合移动到子查询:

    SELECT c.customername, o.amt - p.amt AS Net_Balance
    FROM customers c 
    INNER JOIN (
        SELECT ord.customernumber, SUM(det.quantityordered * det.priceeach) as amt
        FROM orders ord
        INNER JOIN orderdetails det ON ord.ordernumber = det.ordernumber
        GROUP BY ord.customernumber
    ) o ON o.customernumber = c.customernumber
    INNER JOIN (
        SELECT customernumber, SUM(amount) as amt
        FROM payments
        GROUP BY customernumber
    ) p ON p.customernumber = c.customernumber
    

    【讨论】:

      猜你喜欢
      • 2021-06-22
      • 2015-03-22
      • 2014-10-08
      • 1970-01-01
      • 1970-01-01
      • 2016-02-18
      • 1970-01-01
      • 2017-09-04
      • 2017-06-23
      相关资源
      最近更新 更多