Это должно получить его для вас. Трюк состоит в том, чтобы предварительно запросить каждый набор, так что, самое большее, у вас есть одна запись за элемент/комбинацию пакетов. Если нет, и у вас есть несколько в любой таблице, вы получите декартовский результат. Начиная с таблицы элементов, они гарантированно имеют запись, тогда как таблица транзакций может никогда не продавать указанный элемент. Таким образом сначала выполняется предварительный запрос запроса, затем сравнивается сумма всех транзакций, имеющих не более 1: 1 отношение записи. Но если нет соответствующих транзакций для элемента/партии, NVL() вернет нулевое значение, но я установил значение 000000, поэтому, если первая запись имеет нулевое значение, вы не получите ответ на один столбец ширины столбца, с одним 0.
select;
TmpItem.ItemCode,;
TmpItem.BatchNumber,;
TmpItem.SumQ as Qty,;
cast(NVL(TmpTrans.SumUsed, 0) as int) as QtyUsed,;
TmpItem.SumQ - NVL(TmpTrans.SumUsed, 0) as Balance;
from ;
(select ItemCode, BatchNumber, SUM(Qty) as SumQ;
FROM ItemTable;
GROUP BY 1, 2) TmpItem;
LEFT JOIN;
(select ItemCode, BatchNumber, SUM(QtyUsed) as SumUsed;
FROM TransTable;
GROUP BY 1, 2) TmpTrans;
ON TmpItem.ItemCode = TmpTrans.ItemCode;
AND TmpItem.BatchNumber = TmpTrans.BatchNumber
Я думаю, что это будет лучший подход к отливать() результат. т. е .: cast (NVL (TmpTrans.SumUsed, 0) as int) как QtyUsed –