我在sql中完成FIFO的实现。我的申请中有批号的概念。如果假设我是在库存上销售,那么我的应用程序应该告诉我哪个库存是第一个来的。我们走吧。假设我在8月4日-8月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)因此,现在我的库存在我的手中如下:
A Inventory
BT002 - 10 - 4-Aug
BT003 - 15 - 5-Aug
BT001 - 10 - 6-Aug现在,如果我想把库存卖给任何人,那么我的应用程序应该告诉我,我应该首先出售BT002 (批号)库存,因为它是第一位的。
这就是我在我的应用程序中使用的概念。
现在我想从'A‘(库存)卖出15 Qty。
那么O/p应该是这样的:
BT002 - 10
BT003 - 5以下是我的查询:
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给定查询的O/p:

我怎样才能得到这样的O/P:
BT002 - 10
BT003 - 5任何帮助都将不胜感激。提前谢谢你。
发布于 2014-08-06 07:04:18
这应该适用于你:
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只需确保用查询替换函数的标记部分.
发布于 2014-08-06 06:34:44
您需要在数据库中创建一个存储过程,并从库存表中获取数量。你也应该有每个记录的id来更新那些记录。
Alter PROCEDURE sp_UpdateStockForSale
@batchNO varchar(10),
@qty decimal(9,3)
AS
BEGIN
Create Table #tmpOutput(ID int identity(1,1), StockID int, batchNo varchar(10), qty decimal(9,3));
SET NOCOUNT ON;
DECLARE @ID int;
DECLARE @Stock Decimal(9,3);
DECLARE @TEMPID int;
Select @TEMPID=(Max(ID)+1) From RS_GIN_Master Where qty > 0 And batch_no = @batchNO;
While (@qty > 0) BEGIN
Select @ID=ID, @Stock=qty From RS_GIN_Master Where qty > 0 And batch_no = @batchNO AND ID < @TEMPID Order By accept_date Desc;
--If Outward Qty is more than Stock
IF (@Stock < @qty) BEGIN
SET @qty = @qty - @Stock;
SET @Stock = 0;
END
--If Outward Qty is less than Stock
ELSE BEGIN
SET @Stock = @Stock - @qty;
SET @qty = 0;
END
Insert Into #tmpOutput(StockID,batchNo,qty)Values(@ID,@batchNO,@Stock);
SET @TEMPID = @ID;
--This will update that record don't need it now.
--Update RS_GIN_Master Set qty = @Stock Where ID=@ID
END
Select StockID, batchNo, qty From #tmpOutput;
END
GO上面的示例没有编译,但是您可以获得逻辑,如何根据FIFO方法从库存表中检索记录。您可以在accept_date表中使用ID而不是ID。但是,我更希望它是独一无二的,所以,如果我想得到一个特定的记录,那么它是可能的。
发布于 2014-08-06 07:06:40
一个查询..。像这样
这应该被调整为您的情况,因为您有组和其他东西,只是为了举例。
;with qty as (
select 15 as value
)
,l as (
select
ROW_NUMBER () over (order by accept_date desc) rn
,*
from xxx
)
,q as (
select
batch_no
,accept_date
,case when value>qty then value-qty else 0 end as remainder
,case when value>qty then qty else value end as used
,rn
from l
cross join qty
where rn=1
union all
select
r.batch_no
,r.accept_date
,case when q.remainder>r.qty then q.remainder-r.qty else 0 end as remainder
,case when q.remainder>r.qty then r.qty else q.remainder end as used
,r.rn
from q
join l r
on q.rn+1 = r.rn
where q.remainder!=0
)
select *
from q
where used != 0以及对它的干扰,http://sqlfiddle.com/#!6/9b063/34/0
https://stackoverflow.com/questions/25152990
复制相似问题