Сумма количества из таблиц1 и Таблицы2, затем минус, чтобы увидеть запас (Доступ SQL) - PullRequest
0 голосов
/ 18 января 2020

У меня есть две таблицы в базе данных Access. Обе таблицы структуры одинаковы. Первая таблица для транзакции и вторая таблица для транзакции. Я пытался получить общее Transaction In и общее Transaction Out для каждого элемента, а затем показать Stock. Ниже приведен скриншот структуры и данных моих таблиц.

enter image description here

Я использую приведенный ниже запрос, который дает неправильный вывод.

SELECT TABLE1.ID, Sum(TABLE1.qty) AS TR_In, Sum(TABLE2.qty) AS TR_Out, Sum(TABLE1.qty)-Sum(TABLE2.qty) AS Stock
          FROM TABLE1 LEFT JOIN TABLE2 ON TABLE1.ID = TABLE2.ID
GROUP BY TABLE1.ID;

enter image description here

Мой ожидаемый результат будет следующим:

enter image description here

Данные таблицы 1

ID  Description Qty
RM001   Item1   3
RM001   Item1   3
RM002   Item2   2
RM003   Item3   1
RM003   Item3   1

Таблица2 Данные

ID  Description Qty
RM001   Item1   1
RM001   Item1   1
RM001   Item1   1
RM002   Item2   1

Ответы [ 3 ]

2 голосов
/ 18 января 2020

Используйте запрос объединения и суммируйте выходные данные из этого:

Select
    ID,
    Sum(TRIn) As TR_In,
    Sum(TROut) As TR_Out,
    Sum(Total) As Stock
From

(Select
    ID,
    Description,
    Qty As TRIn,
    0 As TROut,
    Qty As Total
From
    table1
Order By ID

Union All

Select
    ID,
    Description,
    0 As TRIn,
    Qty As TROut,
    -Qty As Total
From
    table2)

Group By
    ID

Выходные данные:

enter image description here

1 голос
/ 18 января 2020

В настоящее время вы объединяетесь перед агрегированием, переворачивайте его, чтобы агрегировать обе таблицы перед объединением, чтобы избежать двойного подсчета идентификаторов совпадений:

SELECT agg1.id, agg1.TR_In, agg2.TR_Out, 
       (agg1.TR_In - NZ(agg2.TR_Out, 0)) AS Stock
FROM (SELECT TABLE1.ID, SUM(TABLE1.qty) AS TR_In 
      FROM TABLE1
      GROUP BY TABLE1.ID
     ) as agg1 LEFT JOIN
     (SELECT TABLE2.ID, SUM(TABLE2.qty) AS TR_Out 
      FROM TABLE2
      GROUP BY TABLE2.ID
     ) as agg2
     ON agg1.ID = agg2.ID
0 голосов
/ 18 января 2020

В ответе Парфе есть пара посторонних запятых (после AS TR_In… AS TR_Out), а также пропущенный IIF.

В полном объеме запрос должен выглядеть следующим образом:

SELECT agg1.id, agg1.TR_In, agg2.TR_Out, 
       (agg1.TR_In - IIF(agg2.TR_Out IS NULL, 0, agg2.TR_Out)) AS Stock
FROM
 (SELECT TABLE1.ID, SUM(TABLE1.qty) AS TR_In
  FROM TABLE1
  GROUP BY TABLE1.ID) agg1
LEFT JOIN
 (SELECT TABLE2.ID, SUM(TABLE2.qty) AS TR_Out
  FROM TABLE2
  GROUP BY TABLE2.ID) agg2
ON agg1.ID = agg2.ID

Если вы хотите, вы также можете повторить IIF для второго столбца, так что вы получите 0 вместо нуля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...