Как получить результаты, используя несколько вариантов выбора с разными условиями - PullRequest
0 голосов
/ 22 октября 2019

У меня есть четыре таблицы клиентов, заказов, элементов заказов и продаж, и я хочу получить общую сумму задолженности для каждого клиента с балансом для каждого клиента. Для этого я пробовал этот запрос SQL:

SELECT c.name          AS CustomerName, 
       c.contactnumber AS CustomerContactNumber, 
       c.location      AS CustomerAddress, 
       SUM(oi.amount)  AS Amount, 
       SUM(t2.balance) AS Balance 
FROM   orderitems oi 
INNER JOIN orders o ON oi.orderid = o.id 
INNER JOIN customers c ON o.customerid = c.id 
INNER JOIN
    (SELECT s.customerid, 
            SUM(s.balance) AS Balance 
     FROM   sales s 
     INNER JOIN customers c ON s.customerid = c.id 
     GROUP BY s.customerid) t2 ON t2.customerid = c.id 
WHERE o.status == 'Processing' 
GROUP BY 
    c.id, c.contactnumber, c.location 

Он генерирует следующий вывод:

Output

Он правильно рассчитывает сумму к оплате, но он вычисляет баланс дважды, так как исходный баланс для обоих клиентов равен 100 каждому, но он показывает 200 для каждого.

Также обратите внимание, что в заказе есть столбец состояния, в котором будет указано «Обрабатывается», если сумма заказа должна быть выполнена, и будет «Не завершено», если имеется какой-либо баланс.

Структуры таблицы:

Заказы:

Orders

Продажи:

Sales

OrderItems:

OrderItems

Клиенты:

Customers

Пожалуйста, помогите.

Ответы [ 2 ]

0 голосов
/ 22 октября 2019

Это работает?

SELECT c.name          AS CustomerName, 
       c.contactnumber AS CustomerContactNumber, 
       c.location      AS CustomerAddress, 
       SUM(oi.amount)  AS Amount, 
       SUM(s.balance) AS Balance 
FROM   orderitems oi 
INNER JOIN orders o ON oi.orderid = o.id 
INNER JOIN customers c ON o.customerid = c.id 
INNER JOIN sales s on c.id = s.customerid
WHERE o.status == 'Processing' 
GROUP BY 
    c.id, c.contactnumber, c.location 
0 голосов
/ 22 октября 2019

Вы суммируете баланс во внешнем запросе, но это не должно быть, потому что он суммируется во вложенном запросе. Вы можете GROUP BY баланс (что не является хорошей теорией дизайна, но это функционально);или вы можете сделать отдельный подзапрос для суммы (суммы) и , затем присоединить баланс без группировки.

SELECT c.name          AS CustomerName, 
       c.contactnumber AS CustomerContactNumber, 
       c.location      AS CustomerAddress, 
       SUM(oi.amount)  AS Amount, 
       t2.balance      AS Balance
FROM   orderitems oi 
INNER JOIN orders o ON oi.orderid = o.id 
INNER JOIN customers c ON o.customerid = c.id 
INNER JOIN (
   SELECT customerid, SUM(balance) AS Balance
   FROM   sales
   GROUP BY customerid
) t2 ON t2.customerid = c.id 
WHERE o.status == 'Processing' 
GROUP BY c.id, c.contactnumber, c.location, c.name, t2.balance

как 2 подзапроса:

SELECT c.name          AS CustomerName, 
       c.contactnumber AS CustomerContactNumber, 
       c.location      AS CustomerAddress, 
       t3.Amount       AS Amount,
       t2.balance      AS Balance
FROM   customers c
INNER JOIN ( -- subquery to return Amount for each customerid
   select o.customerid, sum(oi.amount) AS Amount
   FROM orderitems oi
   INNER JOIN orders o ON oi.orderid = o.id 
   GROUP BY o.customerid
   WHERE o.status == 'Processing'
) t3 on t3.cusomterid = c.id
INNER JOIN ( -- subquery to return balance for each customerid
   SELECT customerid, SUM(balance) AS Balance
   FROM   sales
   GROUP BY customerid
) t2 ON t2.customerid = c.id 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...