2017-01-22 64 views
0

我有用於接收和發送的應用程序。我正在處理事務表中的這2個進程。在收到手動給出BOE號碼的項目時,所有接收的記錄都有BOE號碼。但是,運出一個項目不會更新這個BOE專欄。其實我需要知道這個Item來自哪個BOE(我想用FIFO)標準。現在我的交易表有很多數據。但我想知道每個英國石油公司有多少項目和多少項目。使用FIFO更新SQL中的事務記錄

我做了這樣的查詢

select 
    F_lot_number, sum(INq) 'IN', sum(OUTs) 'OUT', sum(BOE) 'BOEcount' 
from 
    (select 
     F_lot_number, 
     case 
      when F_Stock_Type = 'IN' then sum(F_qty) 
     end as 'INq', 
     case 
      when F_Stock_Type = 'out' and F_IsBook = '2' then sum(F_qty) 
     end as 'OUTs', 
     case 
      when F_Stock_Type = 'IN' 
       then count(distinct F_BillOf_entryNumber) 
     end as 'BOE' 
    from 
     T_Tra_Transaction 
    group by 
     F_lot_number, F_Stock_Type, F_IsBook) d 
group by 
    F_lot_number 

輸出看起來是這樣的:

enter image description here

如果例如

select 
    F_QTY, F_lot_number, F_BillOf_entryNumber 
from 
    T_Tra_Transaction 
where 
    F_lot_number = '150723A151' 
    and F_Stock_Type = 'IN' 

select 
    F_QTY, F_lot_number, F_BillOf_entryNumber 
from 
    T_Tra_Transaction 
where 
    F_lot_number = '150723A151' 
    and F_Stock_Type = 'out' 

輸出看起來是這樣的:

enter image description here

我需要用相應的BOE編號更新全部狀態。我怎樣才能做到這一點?我需要更新所有我現有的記錄,根據that.if任何幫助非常感謝全部

在我的表中我有transdatetime領域也有。

我檢查了其他批號..

select 
    F_QTY, F_lot_number, F_BillOf_entryNumber 
from 
    T_Tra_Transaction 
where 
    F_lot_number = '150919C131' 
    and F_Stock_Type = 'IN' 

select 
    F_QTY, F_lot_number, F_BillOf_entryNumber 
from 
    T_Tra_Transaction 
where 
    F_lot_number = '150919C131' 
    and F_Stock_Type = 'out' 

,但我走出把這樣的: enter image description here

+0

在第一圖像示出其批號,IN數量,輸出數量,的Boe數計數 – user3262364

+0

親愛@ marc_s..did你從問題中刪除了我的輸出圖像? – user3262364

+0

[如何在sql中實現FIFO]可能的副本(http://stackoverflow.com/questions/25152990/how-to-implement-fifo-in-sql) – Serg

回答

0

我認爲每個批次總是與被收購相同數量出售。 所以這個想法只是row_number()輸入和輸出正確,並從相應的插件更新。未經測試。

update tout 
set F_BillOf_entryNumber = tin.F_BillOf_entryNumber 
from (
    select F_QTY, F_lot_number, F_BillOf_entryNumber 
    , rn = row_number() over (partition by F_QTY, F_lot_number order by transdatetime desc) 
    from 
     T_Tra_Transaction 
    where 
     F_Stock_Type = 'out' 
    ) tout 
join (
    select 
     F_QTY, F_lot_number, F_BillOf_entryNumber 
     , rn = row_number() over (partition by F_QTY, F_lot_number order by transdatetime desc) 
    from 
     T_Tra_Transaction 
    where 
     F_Stock_Type = 'IN' 
    ) tin 
    on tout.F_QTY = tin.F_QTY 
     and tout.F_lot_number = tin.F_lot_number 
     and tout.rn = tin.rn; 

EDIT

我測試樣本數據

create table T_Tra_Transaction(
F_QTY int, F_lot_number int , F_BillOf_entryNumber int, 
    transdatetime int, F_Stock_Type varchar(3)); 
insert T_Tra_Transaction (F_QTY, F_lot_number, F_BillOf_entryNumber,transdatetime,F_Stock_Type) 
values 
(10,1,101,200,'IN'), 
(20,1,102,201,'IN'), 
(20,1,null,200,'out'); 
+0

列名'transdatetime'無效。 – user3262364

+0

我從你的評論中看到它「我也有transdatetime領域」。根據你真實的模式修正它。 – Serg

+0

ok先生,。,,我會檢查 – user3262364