2014-06-15 28 views
0

請注意,我有2個表:添加perovious場量

我想從表中工資trnamt得到更新到tbl_emi在拍攝記錄,但量不應超過EMI量爲每個記錄中,例如在這種情況下,這是在薪水錶量1000應該被添加500到該第一記錄和另外500到第二記錄到tbl_emi表

   tbl_emi 
EMI  DUEDT  REC  Acno 
500 4/30/2014 500  123 
500 5/30/2014 0   123 
500 6/30/2014 0   123 

       slary 
     Acno  Trnamt 
     123   1000 

我用下面的查詢,但它仍然是在tbl_emi tbale中的rec字段加上工資表中的trnamt,但不應超過emi金額。

選擇QUERY1:要創建一個臨時表的accumlated EMI

select a.emi, a.duedt, a.rec, a.acno, coalesce(sum(b.emi),0) as emi_accumulated 
into #accumulated_amount5 
from tbl_emi a 
left join tbl_emi b on a.acno = b.acno and b.duedt < a.duedt 
group by a.emi, a.duedt, a.rec, a.acno; 

QUERY2:要爲工資總額

select a.*, s.RECAMT as salary_amt 
into #accumulated_amount_with_salary5 
from #accumulated_amount5 a 
inner join Tbl_Fin s on a.acno = s.CARDNO; 

更新查詢1創建一個臨時表:要更新REC量

update #accumulated_amount_with_salary5 
set rec = rec + case 
    when salary_amt < emi_accumulated then 0 
    when (salary_amt - emi_accumulated) < emi then salary_amt - emi_accumulated 
    else emi 
end 

更新查詢2

update t 
set lastrecdate=(CAST(GETDATE() AS DATE)), rec = a.rec 
from tbl_emi t 
    inner join #accumulated_amount_with_salary5 a on t.acno = a.acno and t.duedt = a.duedt 
    --Finance 

回答

2

假設你之後使用有累積和功能,這是通過計算累計emi值,相較於trnamt相對容易:

with toupdate as (
     select e.*, sum(emi) over (partition by acno order by duedt) as cumemi 
     from tbl_emi e 
    ) 
update toupdate 
    set rec = (case when trnamt > cumemi then emi 
        else trnamt - cumemi + emi 
       end) 
    from toupdate join 
     slary 
     on toupdate.acno = slary.acno and 
      toupdate.cumemi - emi < trnamt; 

即使沒有累計總和,你仍然可以使用相關蘇一樣的東西bqueries。

編輯:

在SQL Server 2008中,你可以表達的累計總和爲:

with toupdate as (
     select e.*, 
      (select sum(e2.emi) 
       from tbl_emi e2 
       where e2.acno = e.acno and 
        e2.duedt <= e.duedt 
      ) as cumemi 
     from tbl_emi e 
    ) 
update toupdate 
    set rec = (case when trnamt > cumemi then emi 
        else trnamt - cumemi + emi 
       end) 
    from toupdate join 
     slary 
     on toupdate.acno = slary.acno and 
      toupdate.cumemi - emi < trnamt; 
+0

請問SQL服務器2008年,這方面的工作,因爲它顯示我的錯誤:附近有語法錯誤訂購'。 – user2786306

+0

你是如何創建topdate對象的? – user2786306

+0

@ user2786306。 。 。這是一個錯字。它應該是'toupdate'。 –