Объединение двух таблиц отношений «многие ко многим» - PullRequest
2 голосов
/ 31 марта 2019

Проблема:

Найти чистый остаток от общей суммы заказа и общей суммы платежей для каждого клиента.

Включено 4 таблицы: OrderDetails, Orders, Payments и Customer.

Общая сумма заказа = количество заказа * цена каждого [в OrderDetails]

Общая сумма оплаты = сумма различных платежей для одного и того же заказа.

Customers связаныдо Payments и Orders с CustomerNumber.Orders связаны с OrderDetails с помощью OrderNumber.

Я попытался объединить 4 таблицы с помощью функции INNER JOIN.

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 для почтикаждый клиент.

Однако, то, что я получил, это общая сумма заказа и общая сумма оплаты, умноженная на некоторые константы.В частности, общая сумма платежа умножается на количество платежей за каждый заказ.

У кого-нибудь есть идеи по спасению моей жизни?

Ответы [ 2 ]

1 голос
/ 31 марта 2019

Это типичная проблема при работе с отношениями 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
0 голосов
/ 31 марта 2019
SELECT c.customername, SUM(od.quantityordered*od.priceeach) as ordersum ,  SUM(p.amount) as paymentsum' 

Каков результат двух столбцов?
Это то, что вы хотите?

...