脚本比较和总结两个foxpro表

时间:2017-01-24 03:28:13

标签: visual-foxpro foxpro

我有2张桌子

项目表

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 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

这是另一种方式。使用UNION语句组合两个表。这样,您就可以将所有记录放在一个游标/表中。在第二个声明中,您可以使用GROUP BY获取QtyQtyUsedBalance字段的总计。

有时将工作分成较小的选择语句可以使问题更容易理解。

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

答案 2 :(得分: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

确定 ItemCode BatchNumber 是不同的