SQL - 将记录添加到临时表,直到完成订单

时间:2014-06-27 18:12:35

标签: sql sql-server tsql

解决这种情况有哪些方法?我想从表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中的相同记录。

2 个答案:

答案 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 aproach
create 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