首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >连接2个多对多关系表

连接2个多对多关系表
EN

Stack Overflow用户
提问于 2019-04-01 04:35:17
回答 2查看 358关注 0票数 2

问题:

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

涉及到4个表:OrderDetailsOrdersPaymentsCustomer

订单总额=订单数量*价格,单位为OrderDetails

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

Customers通过CustomerNumber链接到PaymentsOrdersOrders通过OrderNumber链接到OrderDetails

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

代码语言:javascript
复制
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。

具体地说,显示的总付款数乘以每个订单的付款次数。

有谁有办法救我的命吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-01 04:42:27

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

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2019-04-01 04:54:22

代码语言:javascript
复制
SELECT c.customername, SUM(od.quantityordered*od.priceeach) as ordersum ,  SUM(p.amount) as paymentsum' 

这两列的结果是什么?

这是你想要的吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55445210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档