先入先出(FIFO)的一种SQL语句查询算法

在论坛上几次碰到过类似的于FIFO问题,故共享一个有些"恶搞"的算法。

在很多情况下,需要对一些记录,比如出入库记录,收付款记录进行先入先出的匹配。一般来说普通做法是在某个物料出库的时候通过程序来对比实现。但这种设计对业务要求比较严格。比如需要事先制定,退货,红冲的处理方式。在一些简单的系统中可以直接采用查询来实现。下面用个例子来说明。

两个表
入表 tin(id,marno,qty) // id,主键,可视为批号 ; marno , 物料编号; qty数量
出表 tout(id,marno,qty)

记录如下
tin
id |marno|qty                  
1  | A   |10                  
2  | A   |5                    
3  | B   |20                  
4  | C   |7                    
5  | A   |15                  
6  | A   |20                  
                              
tout                              
id |marno|qty                  
1  | A   |3                    
2  | A   |2                    
3  | B   |10                  
4  | A   |1                    
5  | A   |30                  
                              
对照算法
出库             |对应入库批号
id |marno|qty    |id   |数量|剩
1  | A   |3      | 1   |10  |7
2  | A   |2      | 1   |7   |5
3  | B   |10     | 3   |20  |10
4  | A   |1      | 1   |5   |4
5  | A   |4      | 1   |4   |  
5  | A   |5      | 2   |5   |  
5  | A   |15     | 5   |15  |  
5  | A   |6      | 6   |20  |14

期望结果                           
出库             |对应入库批号
id |marno|qty    |id   
1  | A   |3      | 1   
2  | A   |2      | 1   
3  | B   |10     | 3   
4  | A   |1      | 1   
5  | A   |4      | 1   
5  | A   |5      | 2   
5  | A   |15     | 5   
5  | A   |6      | 6   

 

SQL 语句:

 

SELECT o.id,o.marno,
    iif(i.accQty<o.accQty,i.accQty,o.accQty) - iif(i.paccQty>o.paccQty,i.paccQty,o.paccQty) AS ActualIssureQty4Batch,
    i.id
FROM (
    SELECT id, marno, qty,
        val(dsum('qty','tin','marno="'&marno&'" and id<='&id)) AS accQty,
        accQty-qty AS paccQty
    FROM tin
) AS i INNER JOIN (
    SELECT id, marno, qty,
        val(dsum('qty','tout','marno="'&marno&'" and id<='&id)) AS accQty,
        accQty-qty AS paccQty
    FROM tout
) AS o ON i.marno=o.marno and i.accQty>o.paccQty and i.paccQty<o.accQty
order by o.id,i.id


当然,也可以在查询中加上tin的价格等字段以满足实际的需求。

注意
这个方法,做为趣味在表中记录不多的情况尚可一用,如果是大量记录,则使用代码解决比较高效。

你可能感兴趣的:(JOIN,sql,c,算法)