解决这种情况有哪些方法?我想从表b中选择足够的记录来支持表a,我想从表b中使用最旧的最新记录。
表格a:
orderNum partNum quantity ship date
-----------------------------------------------
1 XYZ 15 7/1/2014
2 XYZ 15 8/1/2014
表格b:
lotID partNum quantity dateEnt
-----------------------------------------------
1 XYZ 10 1/1/2014
2 XYZ 10 2/1/2014
3 XYZ 10 3/1/2014
结果:
orderNum partNum quantity lotID lotQuantity
--------------------------------------------------------
1 XYZ 15 1 10
1 XYZ 15 2 5
2 XYZ 15 2 5
2 XYZ 15 3 10
这就是我试过的
select orderNum,case when lotQty < (orderQty - prevLotQty) then lotQty else orderQty - prevLotQty end as needed,lotID from
(select top 1000 orderNum,tv.orderQty,lotQty,
prevIQty = isNull((select sum(qty) from tableB where partnum = tb.partNum and dateent < tb.dateEnt),0)
from tableA as ta inner join tableB as tb on ta.partNum = tableB.partNum
where tablB.qty > 0 order by dateEnt) as baseQry
where orderQty - prevLotQty > 0
这适用于一个订单,但如果同一部件上有更多订单,则重复使用表b中的相同记录。
答案 0 :(得分:1)
这只是一个大纲,但它是基本的逻辑 SqlDataReader非常有效,所以这将是非常有效的
SqlDatadeader rdrOrderNum -- proper sort
SqlDatadeader rdrLotID -- proper sort
orderNum = null;
quantityNeed;
quantityLeft = 0;
lotID = null;
while(rdrOrderNum.Read());
{
orderrNum = rdrOrderNum.GetInt32(0);
quantityNeed = rdrOrderNum.GetInt32(2);
if (quantityNeed <= quantityLeft)
{
quantityLeft -= quantityNeed;
continue;
}
quantityNeed -= quantityLeft;
while(quantityNeed > 0)
{
if(!rdrLotID.HasRows()) exit;
rdrLotID.Read();
lotID = rdrLotID.GetInt32(0);
int quantityThis = rdrLotID.GetInt32(1);
if (quantityNeed > quantityThis )
{
quatityNeed -= quantityThis;
quantityLeft = 0;
continue;
}
else
{
quantityLeft = quantityThis - quantityNeed;
quantityNeed = 0;
break;
}
}
}
答案 1 :(得分:0)
就像我在我的意见中所说的那样,在商务逻辑方面解决这个问题会更好,但是如果你真的想在服务器端出于某种原因(夜间工作......)那么就像这个脚本一样。但请记住我在评论中指出的表现问题和其他事情。对于基于C#的解决方案,请看Blam的答案是对该
的sql aproachcreate table tabA (orderNum Numeric(1), partNum varchar(3), quntity numeric(2), shipdate datetime)
create table tabB (lotID Numeric(1), partNum varchar(3), quntity numeric(2), dateEnt datetime)
create table tabC (orderNum Numeric(1), partNum varchar(3), quntity numeric(2), lotID Numeric(1), lotQuntity numeric(2))
insert into tabA values(1,'XYZ',15,'20140107'),
(2,'XYZ',15,'20140107')
insert into tabB values(1,'XYZ',10,'20140101'),
(2,'XYZ',10,'20140102'),
(3,'XYZ',10,'20140103')
select * into #tabB1 from tabB
declare @lnOrderNum numeric(1), @lcPartNum varchar(3), @ldShipdate datetime, @lnQuntity numeric(2)
declare @lnLotID numeric(1), @lcPartNum1 varchar(3), @ldEntdate datetime, @lnQuntity1 numeric(2),
@lnQuntity2 numeric(2), @lnQuntity3 numeric(2)
declare cur_a cursor for
select *
from tabA
order by shipdate
open cur_a
fetch next from cur_a into @lnOrderNum, @lcPartNum,@lnQuntity, @ldShipdate
while @@Fetch_status=0
BEGIN
SET @lnQuntity3 = @lnQuntity
while @lnQuntity > 0
BEGIN
select top 1 lotID, partNum, quntity, dateEnt into #tmpB1
from #tabB1
where quntity > 0
order by dateEnt
set @lnLotID = (select top 1 lotId from #tmpB1 )
set @lcPartNum1 = (select top 1 partNum from #tmpB1 )
set @ldEntdate = (select top 1 dateEnt from #tmpB1 )
set @lnQuntity1 = (select top 1 quntity from #tmpB1 )
IF @lnQuntity1 >= @lnQuntity
BEGIN
SET @lnQuntity2 = 0
insert into tabC values(@lnOrderNum,@lcPartNum,@lnQuntity3,@lnLotID,@lnQuntity)
update #tabB1
set quntity = @lnQuntity1 - @lnQuntity
where lotId = @lnLotID and partNum = @lcPartNum1 and dateEnt = @ldEntdate
drop table #tmpB1
SET @lnQuntity = @lnQuntity2
END
ELSE
BEGIN
SET @lnQuntity2 = @lnQuntity - @lnQuntity1
insert into tabC values(@lnOrderNum,@lcPartNum,@lnQuntity3,@lnLotID,@lnQuntity1)
update #tabB1
set quntity = 0
where lotId = @lnLotID and partNum = @lcPartNum1 and dateEnt = @ldEntdate
drop table #tmpB1
SET @lnQuntity = @lnQuntity2
END
END
fetch next from cur_a into @lnOrderNum, @lcPartNum,@lnQuntity, @ldShipdate
END
close cur_a
deallocate cur_a
drop table #tabB1
drop table tabA
drop table tabB
SELECT * FROM TABC
drop table tabC