После объединения двух запросов (каждый из которых имеет разные столбцы) с UNION я получаю только один столбец - PullRequest
0 голосов
/ 17 ноября 2018

Я объединил два запроса с ключевым словом UNION (Access 2016). Это выглядит так:

SELECT ITEM.IName, Sum(STOCK_IN.StockIn) AS SumOfIN
FROM ITEM INNER JOIN STOCK_IN ON ITEM.IName = STOCK_IN.IName
GROUP BY ITEM.IName
UNION SELECT ITEM.IName, Sum(STOCK_OUT.StockOut) AS SumOfOut
FROM ITEM INNER JOIN STOCK_OUT ON ITEM.IName = STOCK_OUT.IName
GROUP BY ITEM.IName

Я получаю следующий результат:

IName | SumOfIN
----------------
Abis Nig | 3

Abrotanum | 1

Acid Acet | 2

Aconite  Nap |  2

Aconite  Nap |  3

Antim Crud |    3

Antim Tart |    1

Но я хочу следующий результат:

IName | SumOfIN | SumOfOut
----------------

Abis Nig | 3 | 0

Abrotanum | 1 | 0

Acid Acet | 2 | 0

Aconite  Nap | 2 | 3

Antim Crud | 0 | 3

Antim Tart | 0 | 1

Может кто-нибудь сказать мне, какие изменения я должен сделать здесь?

Ответы [ 2 ]

0 голосов
/ 17 ноября 2018

Вы можете выполнить этот запрос вообще без UNION:

select i.iname, si.sumofin, so.sumofout
from (item as i left join
      (select si.iname, sum(si.stockin) as sumofin
       from stock_in as si
       group by si.iname
      ) as si
      on si.iname = i.iname
     ) left join
     (select so.iname, sum(so.stockout) as sumofout
      from stock_out as so
      group by so.iname
     ) as so
     on so.iname = i.iname;

Сюда будут входить товары, которых нет в наличии или нет в наличии.Это может быть хорошо или плохо.Если это плохо, то добавьте:

where si.sumofin > 0 or so.sumofout > 0

Если вы собираетесь использовать union all, тогда вы можете отказаться от join для предметов целиком:

SELECT IName, SUM(SumOfIN), Sum(SumOfOut) 
FROM (SELECT si.IName, Sum(si.StockIn) AS SumOfIN, 0 AS SumOfOut
      FROM STOCK_IN as si
      GROUP BY si.INAME
      UNION ALL
      SELECT so.IName, 0, Sum(so.StockOut)
      STOCK_OUT so 
      GROUP BY so.IName
     ) s
GROUP BY IName;

JOIN понадобится только в том случае, если у вас есть запасные позиции, которых нет в таблице items.Это было бы признаком плохого моделирования данных.

0 голосов
/ 17 ноября 2018

Вам необходимо добавить фиктивные значения для третьего столбца, где они не существуют в таблице, которую вы UNION ing.Кроме того, вам нужен общий SELECT / GROUP BY, так как вы можете иметь значения для StockIn и StockOut:

SELECT IName, SUM(SumOfIN), Sum(SumOfOut) 
FROM (SELECT ITEM.IName, Sum(STOCK_IN.StockIn) AS SumOfIN, 0 AS SumOfOut
      FROM ITEM INNER JOIN STOCK_IN ON ITEM.IName = STOCK_IN.IName
      GROUP BY ITEM.IName
      UNION ALL
      SELECT ITEM.IName, 0, Sum(STOCK_OUT.StockOut)
      FROM ITEM INNER JOIN STOCK_OUT ON ITEM.IName = STOCK_OUT.IName
      GROUP BY ITEM.IName) s
GROUP BY IName

Обратите внимание, что имена столбцов в таблице результатов все взяты из первой таблицы в UNION, поэтому мы должны назвать SumOfOut в этом запросе.

...