比较和求和两个 foxpro 的脚本 table
Script to compare and sum two foxpro table
我有2张桌子
项目Table
ItemCode BatchNumber Qty
Item01 Batch1 50
Item02 Batch2 75
交易Table
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脚本来实现这个输出?
这应该可以帮你搞定。诀窍是 pre-query 每个集合,因此每个项目/批次组合最多有一个记录。如果不是,并且 table 中有多个,您将得到笛卡尔结果。从商品 table 开始,这些都保证有记录,而交易 table 可能永远不会出售该商品。这样先查询item pre-summarized,然后再和所有最多有1:1比例记录的交易总和进行比较。但是如果一个项目/批次没有相应的交易,NVL() 将 return 一个零值,但我设置为 000000 所以如果第一条记录有一个空值,你不会得到一个数字列宽的答案通过只用一个 0.
做 null
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
这是另一种方法。使用 UNION
语句合并两个表。这样您就可以将所有记录集中在一个 cursor/table 中。在第二条语句中,您可以执行 GROUP BY
以获得 Qty
、QtyUsed
和 Balance
字段的总计。
有时将工作拆分成更小的 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
简单地说:
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 不同
我有2张桌子
项目Table
ItemCode BatchNumber Qty
Item01 Batch1 50
Item02 Batch2 75
交易Table
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脚本来实现这个输出?
这应该可以帮你搞定。诀窍是 pre-query 每个集合,因此每个项目/批次组合最多有一个记录。如果不是,并且 table 中有多个,您将得到笛卡尔结果。从商品 table 开始,这些都保证有记录,而交易 table 可能永远不会出售该商品。这样先查询item pre-summarized,然后再和所有最多有1:1比例记录的交易总和进行比较。但是如果一个项目/批次没有相应的交易,NVL() 将 return 一个零值,但我设置为 000000 所以如果第一条记录有一个空值,你不会得到一个数字列宽的答案通过只用一个 0.
做 nullselect;
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
这是另一种方法。使用 UNION
语句合并两个表。这样您就可以将所有记录集中在一个 cursor/table 中。在第二条语句中,您可以执行 GROUP BY
以获得 Qty
、QtyUsed
和 Balance
字段的总计。
有时将工作拆分成更小的 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
简单地说:
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 不同