如何在sql中实现FIFO

Har*_*mar 6 sql sql-server

我在sql中进行FIFO实现.我的应用程序中有批号概念.如果假设我在库存中销售,那么我的应用程序应该告诉我哪个库存是先到的.让我们.假设我在8月4日,5月5日和8月6日购买了库存'A'

On 4th Aug - A Inventory has batch number   BT002 - 10 (Qty)
On 5th Aug - A's Inventory has batch number BT003 - 15 (Qty)
On 6th Aug - A's Inventory has batch number BT001 - 10 (Qty)
Run Code Online (Sandbox Code Playgroud)

所以,现在我有股票现在我手中如下:

A Inventory
BT002 - 10 - 4-Aug
BT003 - 15 - 5-Aug
BT001 - 10 - 6-Aug
Run Code Online (Sandbox Code Playgroud)

现在,如果我想将库存出售给任何人,那么我的应用程序应该告诉我,我应该首先卖掉BT002(批号)库存,因为它首先出现.

这就是我在我的应用程序中使用的概念.

现在我想从'A'(库存)卖出15个数量.

那么O/p应该是这样的:

BT002 - 10
BT003 - 5
Run Code Online (Sandbox Code Playgroud)

这是我的查询:

SELECT ISNULL(SUM(qty),0) AS Qty,batch_no,accept_date  FROM RS_GIN_Master 
GROUP BY batch_no,accept_date
HAVING ISNULL(SUM(qty),0) <= 15
ORDER BY accept_date asc
Run Code Online (Sandbox Code Playgroud)

给定查询的O/P:

在此输入图像描述

我怎样才能获得这样的O/P:

BT002 - 10
BT003 - 5
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激.先感谢您.

Avi*_*ner 5

这应该适合你:
Fiddle 上的工作示例

CREATE FUNCTION [dbo].[GetBatchAmounts]
(
    @requestedAmount int

)
RETURNS 
@tBatchResults TABLE 
(   
    Batch nvarchar(50),
    Amount int
)
AS
BEGIN
    /*This is just a mock of ersults of your query*/
    DECLARE @RS_GIN_Master TABLE( 

     Qty int,
     batch_no NVARCHAR(max),
     accept_date DATETIME
    )

    insert into @RS_GIN_Master(Qty,batch_no,accept_date)
    SELECT 10,'BT002', CAST(CAST(2014 AS varchar) + '-' + CAST(8 AS varchar) + '-' + CAST(4 AS varchar) AS DATETIME)

    insert into @RS_GIN_Master(Qty,batch_no,accept_date)
    SELECT 10,'BT003', CAST(CAST(2014 AS varchar) + '-' + CAST(8 AS varchar) + '-' + CAST(5 AS varchar) AS DATETIME)

    insert into @RS_GIN_Master(Qty,batch_no,accept_date)
    SELECT 10,'BT001', CAST(CAST(2014 AS varchar) + '-' + CAST(8 AS varchar) + '-' + CAST(6 AS varchar) AS DATETIME)
    /*---------------------------*/

     DECLARE @Qty int
     DECLARE @batch_no NVARCHAR(max)
     DECLARE @accept_date DATETIME


    DECLARE myCursor CURSOR FOR

    SELECT Qty, batch_no, accept_date FROM @RS_GIN_Master ORDER BY accept_date ASC

    OPEN myCursor

    FETCH NEXT FROM myCursor INTO  @Qty, @batch_no,@accept_date

    WHILE (@@FETCH_STATUS = 0 AND @requestedAmount > 0 ) 
    BEGIN

        Declare @actualQty int
        IF @requestedAmount > @Qty
            SET @actualQty = @Qty
        ELSE    
            SET @actualQty = @requestedAmount


        INSERT INTO @tBatchResults (batch, Amount)
        SELECT @batch_no, @actualQty

        set @requestedAmount  = @requestedAmount - @actualQty

        FETCH NEXT FROM myCursor INTO @Qty, @batch_no,@accept_date

    END /*WHILE*/

    CLOSE myCursor
    DEALLOCATE myCursor

    RETURN
END
Run Code Online (Sandbox Code Playgroud)

只需确保用您的查询替换函数的标记部分...