当前位置: 代码迷 >> Sql Server >> 利息结算脚本,该怎么处理
  详细解决方案

利息结算脚本,该怎么处理

热度:101   发布时间:2016-04-24 10:26:38.0
利息结算脚本
一个例子说明啊:
12月31日利率 0.1 (按一年360计息)
1月1日A客户存款10000元整.
2月1日利率上调至0.2
3月1日客户取款时本息合计的公式是:本金+(本金×利率1×天数)+(本金×利率2×天数)
-----------------------------------------------------------
数据库有利率表一张
ID   NAME   LILV  Sdate
1    活期      0.1     2013-12-31
2    活期      0.1     2014-02-01
业务表一张
ID  NAME  MONEY   BDATE           TYPEID
1   A客户   10000      2014-01-01        1
2   B客户   5000        2014-02-01        2
----------------------------------------------------------
求问 :这个计算本息的脚本怎么写啊 
------解决方案--------------------
drop table #Orders;
drop table #lilv;
with lilv(ID,NAME,LILV,SDate) as (
select 1 ,'活期',0.1,'2013-12-31' union all
select 2 ,'活期',0.2,'2014-02-01' 
)select * into #lilv from lilv;
with Orders (ID,NAME,MONEY,BDATE,TYPEID) as 
(
select 1,'A客户',10000,'2014-01-01',1 union all
select 2,'B客户',5000 ,'2014-02-01',2 union all
select 3,'C客户',1000 ,'2014-01-11',1 union all
select 4,'D客户',1000 ,'2014-02-11',2 
)select * into #Orders from Orders;

declare @EDate date ='2014-03-01';--假设不计算此天的利息
declare @EID int =0;--要求利率表的ID与SDate单调性一致。如果不一致,就要自己排序了,且不能用ID了。
select top 1 @EID=Id from #lilv where SDate<@EDate order by SDate desc;
--print @EID;
with t as (
select o.*,l.LILV,case when l.SDate<o.BDATE then o.BDATE else l.SDate end SDate,isnull((select top 1 SDate from #lilv l2 where l2.ID>l.ID order by l.ID),@EDate) EDate
from #Orders o
cross apply (select * from #lilv where ID between o.TYPEID and @EID) l
)
select 
ID,NAME,MONEY,t.MONEY+SUM(t.MONEY*LILV/100.0*DATEDIFF(DD,SDate,EDate)) MONEY2
from t
group by ID,NAME,MONEY
  相关解决方案