Вы можете выполнить этот запрос вообще без 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
.Это было бы признаком плохого моделирования данных.