Я получаю неверную сумму в своем запросе Access? - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть база данных, которая отслеживает ссуды по частям и окупаемость для нескольких организаций в моей компании. У меня есть запрос, который для данного клиента и имени детали должен показывать сумму из того, сколько было взято в аренду (возможно, было несколько займов), сумму из того, что было возвращено (может быть, несколько возвратов) и рассчитанный поле, которое принимает разницу двух. Сумма в RcvdQTY вычисляется неправильно. В примере на скриншоте ниже это должно быть Rcvd = 72, Paid Back = 72, Balance = 0, но это читает 648, 72, 576

Снимок экрана моего запроса ниже: enter image description here

Как и просили, вот мой SQL для запроса:

SELECT CustomerT.CustomerProgram, PartsT.PartName, PartsT.IndiaUID, PartsT.NSN, Sum(DiversionT.RcvdQTY) AS SumOfRcvdQTY, Sum(PaybackT.PayAmountParts) AS SumOfPayAmountParts, Sum([RcvdQTY]-[PayAmountParts]) AS BalanceOwed
FROM SupplierT 
INNER JOIN (PayMethodT 
INNER JOIN ((PartsT 
INNER JOIN (CustomerT 
INNER JOIN DiversionT 
ON CustomerT.CustomerID = DiversionT.CustomerID) 
ON PartsT.PartID = DiversionT.PartID) 
INNER JOIN PaybackT 
ON (PartsT.PartID = PaybackT.PartID) AND (CustomerT.CustomerID = PaybackT.CustomerID)) 
ON (PayMethodT.PayMethodID = PaybackT.PayMethodID) AND (PayMethodT.PayMethodID = DiversionT.PayMethodID)) 
ON SupplierT.SupplierID = DiversionT.SupplierID
GROUP BY CustomerT.CustomerProgram, PartsT.PartName, PartsT.IndiaUID, PartsT.NSN
HAVING (((CustomerT.CustomerProgram)="M777 Australia") AND ((PartsT.PartName)="CSD-R"));

Ответы [ 2 ]

1 голос
/ 01 мая 2020

На основе помощи Парфе я создал два подзапроса, затем создал еще один запрос, который взял выходные данные и выполнил окончательный расчет. Благодаря помощи я смог получить правильные суммы с помощью следующего SQL кода:

SELECT SinglePartPaybackSumQ.CustomerProgram, PartsT.IndiaUID, PartsT.NSN, PartsT.PartName, SinglePartSumQ.SumOfRcvdQTY, SinglePartPaybackSumQ.SumOfPayAmountParts, [SumOfRcvdQTY]-[SumOfPayAmountParts] AS BalanceOwed

FROM (PartsT INNER JOIN SinglePartPaybackSumQ ON PartsT.PartID = SinglePartPaybackSumQ.PartID) INNER JOIN SinglePartSumQ ON PartsT.PartID = SinglePartSumQ.PartID;
1 голос
/ 30 апреля 2020

Поскольку ваши нежелательные результаты, дающие 648, 72 и 576, кратны 72, вы, вероятно, столкнулись с дублирующимися суммами из нескольких объединений. Следовательно, при агрегировании он суммирует все эти повторяющиеся значения.

Рассматривая свой дизайн запросов, рассмотрите возможность объединения двух отдельных агрегированных запросов для окончательного выражения BalancedOwed . Ниже мое предположение о ваших скорректированных SQL. Исправьте имена столбцов и таблиц по мере необходимости. Все остальные ненужные таблицы были удалены:

SELECT d_agg.CustomerProgram, d_agg.PartName, d_agg.IndiaUID, d_agg_agg.MSN, 
       d_agg.Total_RcvdQTY, p_agg.Total_PayAmountParts,
       (d_agg.Total_RcvdQTY - p_agg.Total_PayAmountParts) AS BalanceOwed
FROM 
  (SELECT c.CustomerProgram, prt.PartName, prt.IndiaUID, prt.MSN, 
          SUM(d.RcvdQTY) AS Total_RcvdQTY
   FROM (CustomersT c
   INNER JOIN DiversionT d
      ON c.CustomerID = d.CustomerID)
   INNER JOIN PartsT prt
      ON prt.PartID = d.PartID    
   GROUP BY c.CustomerProgram, prt.PartName, prt.IndiaUID, prt.MSN
  ) d_agg

INNER JOIN
  (SELECT c.CustomerProgram, prt.PartName, prt.IndiaUID, prt.MSN, 
          SUM(pyb.PayAmountParts) AS Total_PayAmountParts
   FROM (CustomersT c
   INNER JOIN PaybackT pyb
      ON c.CustomerID = pyb.CustomerID)
   INNER JOIN PartsT prt
      ON prt.PartID = pyb.PartID    
   GROUP BY c.CustomerProgram, prt.PartName, prt.IndiaUID, prt.MSN
  ) p_agg

 ON d_agg.CustomerProgram = p_agg.CustomerProgram
 AND d_agg.PartName = p_agg.PartName
 AND d_agg.IndiaUID = p_agg.IndiaUID
 AND d_agg_agg.MSN = p_agg.MSN

WHERE d_agg.CustomerProgram = 'M777 Australia'
AND d_agg.PartName = 'CSD-R'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...