2017-01-24 62 views
1

我有2個表腳本比較和總結2 FoxPro表

項目表

ItemCode  BatchNumber Qty 
Item01  Batch1   50 
Item02  Batch2   75 

事務表

ItemCode  BatchNumber QtyUsed 
Item01  Batch1   4 
Item02  Batch2   7 

所需的輸出

ItemCode  BatchNumber Qty QtyUsed Balance 
Item01  Batch1   50  4  46 
Item02  Batch2   75  7  68 

什麼sql腳本來實現這個輸出?

回答

3

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

我認爲這將是一個更好的辦法來投()的結果。即:以QtyUsed的形式投射(NVL(TmpTrans.SumUsed,0)爲int) –

1

這是另一種方式。使用UNION語句組合兩個表。這樣你就可以將所有的記錄放在一個遊標/表格中。在第二個聲明中,您可以執行GROUP BY以獲得Qty,QtyUsedBalance字段的總計。

有時將工作分解爲較小的select語句可以使問題更容易理解。

SELECT i.ItemCode, i.BatchNumber, i.Qty, 0000 as QtyUsed ; 
    FROM Item i ; 
UNION ; 
SELECT t.ItemCode, t.BatchNumber, 0000 as Qty, t.QtyUsed ; 
    FROM Transaction t ; 
    INTO CURSOR one 

SELECT ItemCode, BatchNumber, SUM(Qty) as Qty, SUM(QtyUsed) as QtyUsed, (SUM(Qty) - SUM(QtyUsed)) as Balance ; 
    FROM one ; 
    INTO CURSOR two ; 
    GROUP BY ItemCode, BatchNumber 
0

簡單:

SELECT a.ItemCode, a.BatchNumber, a.Qty 
     b.QtyUsed, a.Qty - b.QtyUsed as Balance 
    FROM ItemTable a 
    LEFT JOIN TransactionTable b ON a.ItemCode = b.ItemCode 
          and a.BatchNumber = b.BatchNumber 

當然如果ItemCodeBatchNumber是不同的