34,590
社区成员
发帖
与我相关
我的任务
分享
采购单(表TB1)
名称 日期 金额
广工学院 2012-05-13 6000.00
广工学院 2012-06-15 2000.00
理工学院 2012-05-13 1000.00
理工学院 2012-06-03 2000.00
理工学院 2012-07-20 3000.00
收款单(表TB2)
名称 日期1 金额1 日期2 金额2
广工学院 2012-07-13 5000.00 2012-09-10 5000
理工学院 2012-08-13 15000.00 NULL NULL
在收款单里,是从客户收款回来的第一次时间(日期1,金额1)开始计利息。
如果一次没收完款,就在第二次时间(日期2,金额2)来收。
例如:广工学院在7、9月各收5000元,而广工学院在5月采购了6000元,所以把6000元分为7月及9月计,5000元的7月,1000元9月算。
名称 日期 金额 想得到这利息金额?
广工学院 2012-05-13 6000.00 5000.00*(2012-07-13 - 2012-05-13)*0.00334 + 1000.00*(2012-09-10 - 2012-05-13)*0.00334
广工学院 2012-06-15 2000.00 2000.00*(2012-09-10 - 2012-06-15)*0.00334
理工学院 2012-05-13 1000.00 1000.00*(2012-08-13 - 2012-05-13)*0.00334
理工学院 2012-06-03 2000.00 2000.00*(2012-08-13 - 2012-05-13)*0.00334
理工学院 2012-07-20 3000.00 3000.00*(2012-08-13 - 2012-05-13)*0.00334
请教上面的SQL语句?
--table1
if OBJECT_ID('table1','u') is not null
drop table table1
go
create table table1
(
Name nvarchar(20),
StartDate date,
TotalMoney decimal(18,2)
)
go
insert into table1 values
('广工学院','2012-05-13',6000.00),
('广工学院','2012-06-15',2000.00),
('理工学院','2012-05-13',1000.00),
('理工学院','2012-06-03',2000.00),
('理工学院','2012-07-20',3000.00)
--table2
if OBJECT_ID('table2','u') is not null
drop table table2
go
create table table2
(
Name nvarchar(20),
Date1 date,
Money1 decimal(18,2),
Date2 date,
Money2 decimal(18,2)
)
go
insert into table2 values
('广工学院','2012-07-13',5000.00,'2012-09-10',5000),
('理工学院','2012-08-13',15000.00,null,null)
--SQL
select A.Name,A.StartDate,A.TotalMoney,B.Date1,B.Money1,B.Date2,B.Money2,
case when A.TotalMoney<=B.Money1 then A.TotalMoney*( DATEDIFF(DAY,A.StartDate,B.Date1)*0.00334)
else B.Money1*(DATEDIFF(DAY,A.StartDate,B.Date1)*0.00334)+
(A.TotalMoney- B.Money2)*(DATEDIFF(DAY,A.StartDate,B.Date2)*0.00334)
end 金额
from table1 A
inner join table2 B on A.Name=B.Name
--结果集
/*
Name StartDate TotalMoney Date1 Money1 Date2 Money2 金额
广工学院 2012-05-13 6000.00 2012-07-13 5000.00 2012-09-10 5000.00 1419.5000000
广工学院 2012-06-15 2000.00 2012-07-13 5000.00 2012-09-10 5000.00 187.0400000
理工学院 2012-05-13 1000.00 2012-08-13 15000.00 NULL NULL 307.2800000
理工学院 2012-06-03 2000.00 2012-08-13 15000.00 NULL NULL 474.2800000
理工学院 2012-07-20 3000.00 2012-08-13 15000.00 NULL NULL 240.4800000
*/
-- table definition
with tb1(name,date,money) as
(
select '广工学院', '2012-05-13', 6000.00 union all
select '广工学院', '2012-06-15', 2000.00 union all
select '理工学院', '2012-05-13', 1000.00 union all
select '理工学院', '2012-06-03', 2000.00 union all
select '理工学院', '2012-07-20', 3000.00
), tb2(name,date1,money1,date2,money2) as
(
select '广工学院', '2012-07-13', 5000.00, '2012-09-10', 5000 union all
select '理工学院', '2012-08-13', 15000.00, null, null
),
-- start from here
a as
(
select *,m=(select isnull(sum(money),0) from tb1 where name=t.name and date<t.date) from tb1 t
)
select *,
case
when money1>=money+m then money*datediff(day,date,date1)*0.00334
when money1>m then (money1-m)*datediff(day,date,date1)*0.00334 + isnull((money-money1+m)*datediff(day,date,date2)*0.00334, 0)
else money*datediff(day,date,date2)*0.00034
end
from a join tb2 b on a.name=b.name
where isnull(money1,0)+isnull(money2,0)>=money+m
/*
name date money m name date1 money1 date2 money2 (无列名)
广工学院 2012-05-13 6000.00 0.00 广工学院 2012-07-13 5000.00 2012-09-10 5000 1419.500000
广工学院 2012-06-15 2000.00 6000.00 广工学院 2012-07-13 5000.00 2012-09-10 5000 59.160000
理工学院 2012-05-13 1000.00 0.00 理工学院 2012-08-13 15000.00 NULL NULL 307.280000
理工学院 2012-06-03 2000.00 1000.00 理工学院 2012-08-13 15000.00 NULL NULL 474.280000
理工学院 2012-07-20 3000.00 3000.00 理工学院 2012-08-13 15000.00 NULL NULL 240.480000
*/