您的位置:程序门 -> ms-sql server -> 应用实例



sql 分解字符串 问题


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


sql 分解字符串 问题
发表于:2007-09-29 10:57:18 楼主

事情是这样的,我最近在用sql处理一个问题:写一个sql函数,处理这样一系列的字符串
100(500:0.5)(2000:0.3)0.6   ;
50(150:0.5)(500:0.4)0.35   ;
500(1000:0.5)(3000:0.3)(10000:0.25)0.2   ;
......
这是一系列报销比例字符串
"("   最左边的100,50,500   是报销的起付线,消费金额只有   >   起付线   后才给报销。
"()"   内   ":"   左边的是报销比例段,右边是报销比例。
拿第一个来说
起付线是100,500元以下部分报销比例是0.5,2000元以下部分报销比例是0.3,
超过2000元的部分报销比例是0.6
假如消费金额为   5000
首先减掉起付线   5000   -   100   =   4900
这4900属于报销范围内的,
500元以下报销金额为   (500-起付线)*   0.5   =   200
2000元以下报销金额为   (2000-500)*   0.3   =   450
剩下的部分报销金额为   (4900-400-1500)*   0.6   =   1200
总的报销金额为   200   +   450   +   1200   =   1850
大体的意思就是这样。
要求写一个   sql   函数
"blc(@相应的报销比例字符串,@消费金额)",   能计算得出报销的金额。
发表于:2007-09-29 11:26:461楼 得分:0
不懂
发表于:2007-09-29 11:54:352楼 得分:0
没有看明白
发表于:2007-09-29 18:00:193楼 得分:0
呵呵。不错的题目..
不过快下班了。没时间做了
回去做做...
发表于:2007-09-29 23:44:044楼 得分:0
假如消费金额为   5000  
首先减掉起付线   5000   -   100   =   4900  
这4900属于报销范围内的,  
500元以下报销金额为   (500-起付线)*   0.5   =   200  
2000元以下报销金额为   (2000-500)*   0.3   =   450  
剩下的部分报销金额为   (4900-400-1500)*   0.6   =   1200  
总的报销金额为   200   +   450   +   1200   =   1850  
------------------------------------------------------------------------------------------------
始终感觉楼主的这个逻辑有点问题。
按照这个式子100(500:0.5)(2000:0.3)0.6,一般的报销应该是:  
  消费金额-最低起付线=   报销金额
 
1。如果报销金额在500元以下:总报销金额为   报销金额*   0.5  
2。如果报销金额500以上2000元以下:总报销金额为     500*0.5   +   (报销金额-500)*   0.3    
3。如果报销金额在2000以上:总报销金额为   500*0.5   +   (2000-500)*   0.3   +(报销金额-2000-500)*0.6
按照这个模式来算。当消费金额为5000时。总报销金额为:500*0.5   +   2000*0.3   +   (4900-2000-500)*0.6   =   2290
发表于:2007-09-29 23:53:495楼 得分:0
因为我始终觉得楼主您的逻辑有点问题。所以按照一般的报销方式写了个函数:
alter   function   blc(@bxbl   varchar(50),@money   int)
returns   numeric(8,2)
as
begin --100(500:0.5)(2000:0.3)0.6  
declare   @first   int                 --起付线                     相当于100
declare   @bl   varchar(50)       --单个的报销比例       相当于500:0.5
declare   @end   int                     ---')'所在位置          
declare   @je   int                       --金额                           相当于500
declare   @xs   numeric(8,2)     --比例                           相当于0.5
declare   @bx   int                       --可以报销金额      
set   @first=cast(substring(@bxbl,1,charindex('(',@bxbl)-1)   as   int)
set   @money=@money-@first
set   @bx=0
while(charindex('(',@bxbl)> 0   and   @money> 0)
begin
set   @end   =   charindex(')',@bxbl)
set   @bl   =   substring(@bxbl,charindex('(',@bxbl)+1,charindex(')',@bxbl)-charindex('(',@bxbl)-1)
set   @je   =   cast(substring(@bl,1,charindex(':',@bl)-1)   as   int)
set   @xs   =   cast(substring(@bl,charindex(':',@bl)+1,len(@bl))   as   numeric(8,2))
if(@money <=@je)
begin
set   @bx=@bx   +   @money*@xs
end
else
begin
set   @bx=@bx   +   @je*@xs
end

set   @money=@money-@je

set   @bxbl=substring(@bxbl,@end+1,len(@bxbl))
end
if(isnull(@bxbl,'') <> ''   and   @money> 0)
begin
set   @bx=@bx+@money*cast(@bxbl   as   numeric(8,2))
end
return   @bx
end

举例说明:
select   dbo.blc('100(500:0.5)(2000:0.3)0.6',5000)
结果应该同:select   500*0.5   +   2000*0.3   +   (4900-2000-500)*0.6

select   dbo.blc('100(500:0.5)(2000:0.3)(5000:0.2)0.1',8000)
结果应该同:select   500*0.5   +   2000*0.3   +   5000*0.2   +   (7900-500-2000-5000)*0.1
发表于:2007-09-30 00:02:356楼 得分:0
上面的有个地方写错了。

修改下上面的。有个地方写错了

始终感觉楼主的这个逻辑有点问题。  
按照这个式子100(500:0.5)(2000:0.3)0.6,一般的报销应该是:    
  消费金额-最低起付线=   报销金额  
   
1。如果报销金额在500元以下:总报销金额为   报销金额*   0.5    
2。如果报销金额500以上2000元以下:总报销金额为     500*0.5   +   (报销金额-500)*   0.3      
3。如果报销金额在2000以上:总报销金额为   500*0.5   +   2000*   0.3   +(报销金额-2000-500)*0.6  
按照这个模式来算。当消费金额为5000时。总报销金额为:500*0.5   +   2000*0.3   +   (4900-2000-500)*0.6   =   2290  
发表于:2007-09-30 10:11:017楼 得分:0
create   function   jsbxje(@strrate   nvarchar(100),@je   money)
returns   money
begin
declare   @ratetmp   nvarchar(100),
@rate nvarchar(10),
@count   tinyint,
@start nvarchar(10),
@end nvarchar(10),
@bxje money
declare   @t_rate   table
  (
startje   nvarchar(10),
endje   nvarchar(10),
rate   nvarchar(50)
)
set   @ratetmp=@strrate
--分解报销起始值与报销比例
set   @count=len(@strrate)-len(replace(@ratetmp,')',''))
set   @start=left(@strrate,charindex('(',@strrate)-1)
while   @count> 0
begin

set   @strrate=stuff(@strrate,1,charindex('(',@strrate),'')
set   @ratetmp=left(@strrate,charindex(')',@strrate)-1)

set   @end=left(@ratetmp,charindex(':',@ratetmp)-1)
set   @rate=stuff(@ratetmp,1,charindex(':',@ratetmp),'')

insert   into   @t_rate   values(@start,@end,@rate)
set   @count=@count-1
set   @start=@end
set   @end=99999999
end
set   @rate=stuff(@strrate,1,charindex(')',@strrate),'')
insert   into   @t_rate   values(@start,@end,@rate)
--计算报销金额
select   @bxje=cast((@je-startje)*(cast(rate   as   money))   as   money)
from   @t_rate
where   @je> cast(startje   as   int)   and   @je <=cast(endje   as   int)

return(@bxje)
end
发表于:2007-10-26 17:16:548楼 得分:0
没办法   逻辑就是这样的     老板跟我讲的
发表于:2007-10-27 14:33:009楼 得分:0
不可能。我想你们老板不可能是傻的吧```
就算你们老板是,你也应该有自己的意见的。。

假如消费金额为   5000    
首先减掉起付线   5000   -   100   =   4900    
这4900属于报销范围内的,    
500元以下报销金额为   (500-起付线)*   0.5   =   200    
2000元以下报销金额为   (2000-500)*   0.3   =   450    
剩下的部分报销金额为   (4900-400-1500)*   0.6   =   1200    
总的报销金额为   200   +   450   +   1200   =   1850    
--------------------------------
就你们这种算法逻辑,举个超简单的例子,楼主自己想下。
1、如果消费金额为200时,首先减掉起付线   200   -   100   =   100    
这100属于报销范围内的,因为100是在500以下的,
所以用楼主第一种报销方法:500元以下报销金额为   (500-起付线)*   0.5   =   200

2、当消费金额为500时,首先减掉起付线   500   -   100   =   400    
这400属于报销范围内的,因为400是在500以下的,
所以还是用楼主第一种报销方法:500元以下报销金额为   (500-起付线)*   0.5   =   200

难道楼主看不出来消费金额为200和500时,报销金额都是200?
这事好象没有人会愿意的吧?
换作是我,我宁愿拿500去报销两次了。。那就会报销金额为400了。。呵呵。楼主。你们老板这种逻辑真可笑。。。。。。
你应该跟他提出来的。。
   
发表于:2007-10-28 00:11:3510楼 得分:0
逻辑有问题


快速检索

最新资讯
热门点击