2017-01-24 11 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:1の比率のレコードを有するすべてのトランザクションの合計と比較される。しかし、項目/バッチに対応するトランザクションがない場合、NVL()はゼロの値を返しますが、000000に設定します。最初のレコードにNULL値がある場合は、単一の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ステートメントを使用して結合します。この方法で、すべてのレコードを1つのカーソル/テーブルに格納できます。 2番目の声明では、、QtyUsedおよびBalanceフィールドの合計を得るためにGROUP BYを行うことができます。

場合によっては、より小さい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 

確か場合はBatchNumberをItemCodeは、私はそれがより良いアプローチは、()の結果をキャストすることだと思う

関連する問題