日期:2014-05-18  浏览次数:20405 次

急,高手请帮忙!存储过程开发问题
刚学习SQL开发没多久,基本概念学的差不多了,现在要写个存储过程,主要要求如下:
有两张表用来计算收费,比如‘业务1’分三种收费各安一定比例(如表1),然后三种收费又安一定比例分配(如表2),其中‘pid’对应的就是表1中id,也就是表1中的收费1又按三种收费来分配。   如何使用存储过程来输出一个结果集(入参包括业务名和收费金额),   重要的是如果有固定收费的话要先减去固定的然后才能算其他比例的。   如要查业务1,1000的结果集,输出如表3。
id 业务           nname ntype nvalue
1 业务1         收费1 比例 30
2 业务1         收费2 比例 70
3 业务1         收费3 固定 10
表1

id pid nname ntype nvalue
1 1 费1-1 固定 5
2 1 费1-2 比例 50.0000
3 1 费1-3 比例 50.0000
4 2 费2 比例 100.0000
5 3 费3 比例 100.0000
表2

id 业务 nname1 nname1 nvalue
1 业务1 收费1 费1-1 5
2 业务1 收费1 费1-2 ((1000-10)*30%-5)*50%
3 业务1 收费1 费1-3 ((1000-10)*30%-5)*50%
4 业务1 收费2 费2 (1000-10)*70%
5 业务1 收费3 费3 10
表3

急~~~在线等,请高手提示下该怎么做?万分感谢。



------解决方案--------------------
--建立环境
create table 表1 (
id int,
业务 nvarchar(20),
nname nvarchar(20),
ntype nvarchar(20),
nvalue numeric(10,2)
)

create table 表2 (
id int,
pid int,
nname nvarchar(20),
ntype nvarchar(20),
nvalue numeric(10,2)
)


insert 表1 select
1, N '业务1 ', N '收费1 ', N '比例 ', 30
union all select
2, N '业务1 ', N '收费2 ', N '比例 ', 70
union all select
3, N '业务1 ', N '收费3 ', N '固定 ', 10


insert 表2 select
1, 1, N '费1-1 ', N '固定 ', 5
union all select
2, 1, N '费1-2 ' ,N '比例 ', 50.0000
union all select
3, 1, N '费1-3 ' ,N '比例 ', 50.0000
union all select
4, 2, N '费2 ' ,N '比例 ', 100.0000
union all select
5, 3, N '费3 ' ,N '比例 ', 100.0000

go


--存储过程
create proc p_cal
@业务 nvarchar(20),
@收费金额 numeric(10,2)
as

--存放结果
declare @表3 table(
id int IDENTITY(1,1),
pid int ,
业务 nvarchar(20),
nname1 nvarchar(20),
nname2 nvarchar(20),
nvalue numeric(10,2)
)

--存放中间数据
declare @t table(
pid int,
业务 nvarchar(20),
nname1 nvarchar(20),
nvalue numeric(10,2)
)


insert @t
select id,业务,nname,nvalue
from 表1
where 业务=@业务
and ntype=N '固定 '

set @收费金额=@收费金额-(select sum(nvalue) from @t)

insert @t
select id,业务,nname,nvalue=@收费金额*nvalue/100
from 表1
where 业务=@业务
and ntype=N '比例 '


insert @表3(pid,业务,nname1,nname2,nvalue)
select a.pid,t.业务,t.nname1,a.nname,a.nvalue
from 表2 a,@t t
where a.pid=t.pid
and a.ntype=N '固定 '


insert @表3(pid,业务,nname1,nname2,nvalue)
select a.pid,t.业务,t.nname1,a.nname,nvalue=(t.nvalue-isnull((select sum(nvalue) from @表3 where pid=a.pid),0))*a.nvalue/100
from 表2 a,@t t
where a.pid=t.pid
and a.ntype=N '比例 '

--显示结果
select id,业务,nname1,nname2,nvalue from @表3
order by 业务,nname1,nname2,id

go

--调用测试
p_cal N '业务1 ',1000


--结果
id 业务 nname1 nname2 nvalue
----------- -------------------- -------------------- -------------------- ------------
1 业务1 收费1 费1-1 5.00
2 业务1 收费1 费1-2 146.00
3 业务1