300分寻求一算法!如果分不够可以再加!在线等候!!!

jkjj20 2003-09-16 03:45:12
在表中有三个字段
公式编号 公式名称 计算方法
1 应发工资 基本工资+浮动工资
2 实际工资 应发工资-个人所得税
3 个人所得税 应发工资*0.15-88
.........................................
.........................................
我要的结果是能得到 计算方法 字段的最基本项的结合,。例如
公式编号 公式名称 计算方法
1 应发工资 基本工资+浮动工资
2 实际工资 (基本工资+浮动工资)-((基本工资+浮动工资)*0.15-88)
3 个人所得税 (基本工资+浮动工资)*0.15-88
...全文
35 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
DreamManor 2003-12-31
  • 打赏
  • 举报
回复
做个标记
hatedeadlock 2003-09-17
  • 打赏
  • 举报
回复
这个问题我很想看看 最后是怎么解决的!
不好意思 流个标记 方便下次查看
stwx 2003-09-16
  • 打赏
  • 举报
回复
佩服大力!

改进一处,还要加括号,

while exists(select 1 from #临时表 a,#临时表 b where charindex(a.公式名称,b.计算方法)>0)
update #临时表 set 计算方法=replace(#临时表.计算方法,b.公式名称,'('+b.计算方法+')') from #你的表 b
where charindex(b.公式名称,#临时表.计算方法)>0



pengdali 2003-09-16
  • 打赏
  • 举报
回复
---生成测试数据
create table #你的表(公式编号 int,公式名称 varchar(100),计算方法 varchar(200))
insert #你的表 select 1, '应发工资','基本工资+浮动工资' union all select 2 ,'实际工资','应发工资-个人所得税' union all select 3 ,'个人所得税','应发工资*0.15-88'
go


select * into #临时表 from #你的表


-- 一个循环就可以。
while exists(select 1 from #临时表 a,#临时表 b where charindex(a.公式名称,b.计算方法)>0)
update #临时表 set 计算方法=replace(#临时表.计算方法,b.公式名称,b.计算方法) from #你的表 b where charindex(b.公式名称,#临时表.计算方法)>0

select * from #临时表

go
drop table #你的表,#临时表
zjcxc 元老 2003-09-16
  • 打赏
  • 举报
回复
并对应的修改处理的函数:

--创建公式解释函数
create function f_getbasicgs(@公式编号 int)
returns varchar(8000)
as
begin
declare @re varchar(8000)
declare @公式名称 varchar(100),@计算方法 varchar(8000)

select @re=计算方法 from tb where 公式编号=@公式编号
declare #tb cursor local for
select 公式编号,公式名称,计算方法 from tb where 公式编号<>@公式编号 and @re like '%['+公式名称+']%'
open #tb
fetch next from #tb into @公式编号,@公式名称,@计算方法
while @@fetch_status=0
begin
set @re=replace(@re,'['+@公式名称+']',dbo.f_getbasicgs(@公式编号))
fetch next from #tb into @公式编号,@公式名称,@计算方法
end
close #tb
deallocate #tb

return('('+@re+')')
end
go
zjcxc 元老 2003-09-16
  • 打赏
  • 举报
回复
对于我的函数的一点说明:

1.支持嵌套,最多可达32层.即A公式包含B公式,B公式包含C公式,则最终可以变成最明细的C公式

2.因为数据比较的关系,对于这种情况的处理会出错:
公式编号 公式名称 计算方法
1 应发工资 基本工资+浮动工资
2 实际工资 应发工资A-个人所得税 --注意,这里有个字段'应发工资A'
3 个人所得税 应发工资*0.15-88

对于这种情况,可以通过下面的数据存储去避免
公式编号 公式名称 计算方法
1 [应发工资] [基本工资]+[浮动工资]
2 [实际工资] [应发工资A]-[个人所得税]
3 [个人所得税] [应发工资]*0.15-88
zjcxc 元老 2003-09-16
  • 打赏
  • 举报
回复
对于我的函数的一点说明:

1.支持嵌套,最多可达32层.即A公式包含B公式,B公式包含C公式,则最终可以变成最明细的C公式

2.因为数据比较的关系,对于这种情况的处理会出错:
公式编号 公式名称 计算方法
1 应发工资 基本工资+浮动工资
2 实际工资 应发工资A-个人所得税 --注意,这里有个字段'应发工资A'
3 个人所得税 应发工资*0.15-88

对于这种情况,可以通过下面的数据存储去避免
公式编号 公式名称 计算方法
1 [应发工资] [基本工资]+[浮动工资]
2 [实际工资] [应发工资A]-[个人所得税]
3 [个人所得税] [应发工资]*0.15-88
CSDNM 2003-09-16
  • 打赏
  • 举报
回复
最后更新:
alter function get计算方法
(@公式名称 varchar(100))
returns varchar(2000)
as
begin
declare @r varchar(2000)
declare @t varchar(1000)
declare @i int

declare @t1 varchar(1000)
set @r=''
select @t=计算方法 from test6677 where 公式名称=@公式名称
set @i=PATINDEX('%[-+*/()]%', @t)
while @i>0
begin
set @t1=left(@t,@i-1)
if not exists (select * from test6677 where 公式名称=@t1)
--isnumeric(@t1)=1 or @t1='+' or @t1='-' or @t1='*' or @t1='/' or @t1='(' or @t1=')'
set @r=@r+@t1
else
set @r=@r+'('+dbo.get计算方法(@t1)+')'

set @r=@r+substring(@t,@i,1)
set @t=right(@t,len(@t)-@i)
set @i=PATINDEX('%[-+*/()]%', @t)
end
if @t<>''
if not exists (select * from test6677 where 公式名称=@t)
set @r=@r+@t
else
set @r=@r+'('+dbo.get计算方法(@t)+')'
return @r
end


zjcxc 元老 2003-09-16
  • 打赏
  • 举报
回复
用下面的函数

--创建公式解释函数
create function f_getbasicgs(@公式编号 int)
returns varchar(8000)
as
begin
declare @re varchar(8000)
declare @公式名称 varchar(100),@计算方法 varchar(8000)

select @re=计算方法 from tb where 公式编号=@公式编号
declare #tb cursor local for
select 公式编号,公式名称,计算方法 from tb where 公式编号<>@公式编号 and @re like '%'+公式名称+'%'
open #tb
fetch next from #tb into @公式编号,@公式名称,@计算方法
while @@fetch_status=0
begin
set @re=replace(@re,@公式名称,dbo.f_getbasicgs(@公式编号))
fetch next from #tb into @公式编号,@公式名称,@计算方法
end
close #tb
deallocate #tb

return('('+@re+')')
end
go

--创建数据测试环境
create table tb(公式编号 int,公式名称 varchar(100),计算方法 varchar(8000))
insert into tb
select 1,'应发工资','基本工资+浮动工资'
union all select 2,'实际工资','应发工资-个人所得税'
union all select 3,'个人所得税','应发工资*0.15-88'
go

--测试函数
select *,基本计算方法=dbo.f_getbasicgs(公式编号) from tb

--删除测试环境
drop table tb
drop function f_getbasicgs

yujohny 2003-09-16
  • 打赏
  • 举报
回复
经理继续加油
CSDNM 2003-09-16
  • 打赏
  • 举报
回复
注意:
这里判断用了PATINDEX('%[-+*/()]%', @t)
假设只有-+*/()等特殊字符的


更正:(循环少执行了一次)


----建立函数
create function get计算方法
(@公式名称 varchar(100))
returns varchar(2000)
as
begin
declare @r varchar(2000)
declare @t varchar(1000)
declare @i int

declare @t1 varchar(1000)
set @r=''
select @t=计算方法 from test6677 where 公式名称=@公式名称
set @i=PATINDEX('%[-+*/()]%', @t)
while @i>0
begin
set @t1=left(@t,@i-1)
if not exists (select * from test6677 where 公式名称=@t1) --这里的判断需要规范
--isnumeric(@t1)=1 or @t1='+' or @t1='-' or @t1='*' or @t1='/' or @t1='(' or @t1=')'
set @r=@r+@t1
else
set @r=@r+'('+dbo.get计算方法(@t1)+')'
set @r=@r+substring(@t,@i,1)
set @t=right(@t,len(@t)-@i)
set @i=PATINDEX('%[-+*/()]%', @t)
end

if not exists (select * from test6677 where 公式名称=@t) --这里的判断需要规范
--isnumeric(@t1)=1 or @t1='+' or @t1='-' or @t1='*' or @t1='/' or @t1='(' or @t1=')'
set @r=@r+@t1
else
set @r=@r+'('+dbo.get计算方法(@t)+')'
return @r
end

go


j9988 2003-09-16
  • 打赏
  • 举报
回复
经理亲自做题了,我灌水去...... :)
CSDNM 2003-09-16
  • 打赏
  • 举报
回复
---生成测试数据

create table test6677(
公式编号 int,
公式名称 varchar(100),
计算方法 varchar(200)
)
go

insert test6677
select
1, '应发工资', '基本工资+浮动工资'
union all
select
2 , '实际工资' , '应发工资-个人所得税'
union all
select
3 , '个人所得税', '应发工资*0.15-88'
go


----建立函数
create function get计算方法
(@公式名称 varchar(100))
returns varchar(2000)
as
begin
declare @r varchar(2000)
declare @t varchar(1000)
declare @i int

declare @t1 varchar(1000)
set @r=''
select @t=计算方法 from test6677 where 公式名称=@公式名称
set @i=PATINDEX('%[-+*/()]%', @t)
while @i>0
begin
set @t1=left(@t,@i-1)
if not exists (select * from test6677 where 公式名称=@t) --这里的判断需要规范
--isnumeric(@t1)=1 or @t1='+' or @t1='-' or @t1='*' or @t1='/' or @t1='(' or @t1=')'
set @r=@r+@t1
else
set @r=@r+'('+dbo.get计算方法(@t1)+')'
set @r=@r+substring(@t,@i,1)
set @t=right(@t,len(@t)-@i)
set @i=PATINDEX('%[-+*/()]%', @t)
end
set @r=@r+@t
return @r
end

go

----调用
select 公式编号,公式名称,dbo.get计算方法(公式名称) as 计算方法
from test6677

j9988 2003-09-16
  • 打赏
  • 举报
回复
你若要用函数,也可以把上面的语句改成自定义函数,返回字符串就行了.
j9988 2003-09-16
  • 打赏
  • 举报
回复
我上面只是简单的做法,前提是基本项不在表内,如果基本项在表内.where 条件要加上 and a.公式名称<>基本项
jkjj20 2003-09-16
  • 打赏
  • 举报
回复
我知道按照顺序执行可以解决,但是如果公式数量一多,公式的排列起来就很麻烦,用户使用起来不方便,谁能提供这个函数吗,我还可以加分!!!
j9988 2003-09-16
  • 打赏
  • 举报
回复
select 公式编号 公式名称 计算方法 into #t from table

while exists(select 1 from #t a,#t b where charindex(a.公式名称,b.计算方法)>0)

update A set 计算方法=replace(计算方法,b.公式名称,b.计算方法) from #t a,#t b where charindex(a.公式名称,b.计算方法)>0

select * from #t

amtyuranus 2003-09-16
  • 打赏
  • 举报
回复
你就是一个算工资的发放!!

我认为你可以这样做,先把上面的算下来,然后在后面的直接掉用上面的值,就是按一个顺序来计算好了

我们的薪资模块就这样做的

假如硬要得到你那样的话,那你就写一个函数慢慢对字符串分析,看它里面有没有别的公式名称,有就把哪个计算方法来代替,循环下去,一直到计算方法里没有别的公式名称
CSDNM 2003-09-16
  • 打赏
  • 举报
回复
需要一定规范

用函数解决
jkjj20 2003-09-16
  • 打赏
  • 举报
回复
没有人知道吗???

34,874

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧