【问题标题】:Script to compare and sum two foxpro table比较和总结两个foxpro表的脚本
【发布时间】:2017-01-24 03:28:12
【问题描述】:

我有两张桌子

项目表

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脚本来实现这个输出?

【问题讨论】:

    标签: visual-foxpro foxpro


    【解决方案1】:

    这应该会为您提供。诀窍是预先查询每个集合,因此每个项目/批次组合最多只有一条记录。如果不是,并且您在任一表中有多个,您将获得笛卡尔结果。从项目表开始,这些都保证有记录,而交易表可能永远不会销售所述项目。这样,首先完成项目预汇总查询,然后与最多具有 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() 结果会更好。即:cast( NVL( TmpTrans.SumUsed, 0 ) as int) as QtyUsed
    【解决方案2】:

    这是另一种方式。使用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
    

    【讨论】:

      【解决方案3】:

      简单地说:

      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 是否不同

      【讨论】:

        猜你喜欢
        • 2010-12-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-17
        • 2023-03-04
        • 1970-01-01
        相关资源
        最近更新 更多