這應該爲你準備好。訣竅是預先查詢每個集合,因此每個項目/批次組合最多隻有一條記錄。如果沒有,並且你在任何一個表中都有多個,你將得到一個笛卡兒結果。從項目表開始,這些保證有記錄,而交易表可能永遠不會銷售所述項目。這樣,項目預先彙總的查詢首先完成,然後與具有最多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
我認爲這將是一個更好的辦法來投()的結果。即:以QtyUsed的形式投射(NVL(TmpTrans.SumUsed,0)爲int) –