2014-06-27 39 views
0

解決此情況的方法有哪些?我想從表b中選擇足夠的記錄來支持表a,並且我想從表b中使用最早到最新的記錄。SQL - 將記錄添加到臨時表直到訂單滿足爲止

表:

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 

這就是我TR ied

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

請告訴我們你試過的東西。 – JiggsJedi

+0

恰好滿足什麼標準? – Hogan

+0

表b中的數量會發生什麼?每行更新爲零? – Horaciux

回答

0

就像我說的,我oppinion會更好地解決在樓內設有商務邏輯但如果你真的想在服務器端出於某種原因(夜間,...),然後像這樣的腳本。但請記住我在評論中指出的性能問題和其他事情。對於一個基於C#的解決方案,看看Blam的答案在這裏是sql的方法

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 
+0

是的,我想我會採納您的建議並將其從SQL中移除 – user1777129

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; 
     } 
    } 
} 
+0

感謝您的代碼樣品。正如你和@Jester所指出的,這看起來更適合代碼。 – user1777129

+0

所以你問如何解決這個問題。你正在使用這個。但這不是可接受的解決方案。有趣。 – Paparazzi

相關問題