求一段用于ORACLE数据库的PL-SQL写的代码
用PL-SQL写一个函数,用来计算个人所得税:传入工资数,传出个税数。扣除标准:每月1600元,计算个人所得税税率表:工资、薪金所得适用级数全月应纳税所得额税率(%)1不...
用PL-SQL写一个函数,用来计算个人所得税:传入工资数,传出个税数。
扣除标准:每月1600元,计算个人所得税税率表 :工资、薪金所得适用
级 数 全月应纳税所得额 税率(%)
1 不超过500元的 5
2 超过500元至2000元的部分 10
3 超过2000元至5000元的部分 15
4 超过5000元至20000元的部分 20
5 超过20000元至40000元的部分 25
6 超过40000元至60000元的部分 30
7 超过60000元至80000元的部分 35
8 超过80000元至100000元的部分 40
9 超过100000元的部分 45 展开
扣除标准:每月1600元,计算个人所得税税率表 :工资、薪金所得适用
级 数 全月应纳税所得额 税率(%)
1 不超过500元的 5
2 超过500元至2000元的部分 10
3 超过2000元至5000元的部分 15
4 超过5000元至20000元的部分 20
5 超过20000元至40000元的部分 25
6 超过40000元至60000元的部分 30
7 超过60000元至80000元的部分 35
8 超过80000元至100000元的部分 40
9 超过100000元的部分 45 展开
2个回答
展开全部
楼上的计算有误,税额是分层计算的。
楼主我的程序已经通过测试,并且我把你的1600的起征额设置为了变量,可传入。100分好像有点少哦,呵呵!
--create by terrycui at 2010/3/20 18:00-18:45
create or replace function get_taxamount(v_totalamount number,v_startamount number)
return number is v_taxamount number;
v_taxrate number; --税率
v_balance number; --差额(计算最后一个层级税额的金额)
v_subtaxamount number; --最后一层税额之前所有层级满额的总和
begin
v_balance := v_totalamount - v_startamount;
if v_balance <= 500 then
v_taxrate := 5;
v_subtaxamount := 0;
v_balance := v_balance - 0;
elsif v_balance <= 2000 then
v_taxrate := 10;
v_subtaxamount := 25;
v_balance := v_balance - 500;
elsif v_balance <= 5000 then
v_taxrate := 15;
v_subtaxamount := 175;
v_balance := v_balance - 2000;
elsif v_balance <= 20000 then
v_taxrate := 20;
v_subtaxamount := 625;
v_balance := v_balance - 5000;
elsif v_balance <= 40000 then
v_taxrate := 25;
v_subtaxamount := 3625;
v_balance := v_balance - 20000;
elsif v_balance <= 60000 then
v_taxrate := 30;
v_subtaxamount := 8625;
v_balance := v_balance - 40000;
elsif v_balance <= 80000 then
v_taxrate := 35;
v_subtaxamount := 14625;
v_balance := v_balance - 60000;
elsif v_balance <= 100000 then
v_taxrate := 40;
v_subtaxamount := 21625;
v_balance := v_balance - 80000;
elsif v_balance > 100000 then
v_taxrate := 45;
v_subtaxamount := 29625;
v_balance := v_balance - 100000;
end if;
v_taxamount := v_balance * v_taxrate / 100 + v_subtaxamount;
return v_taxamount;
end get_taxamount;
你执行一下,然后运行:
select get_taxamount(18000,1600) from dual --18000是薪水总额,1600是起征额。
加分加分~~
楼主我的程序已经通过测试,并且我把你的1600的起征额设置为了变量,可传入。100分好像有点少哦,呵呵!
--create by terrycui at 2010/3/20 18:00-18:45
create or replace function get_taxamount(v_totalamount number,v_startamount number)
return number is v_taxamount number;
v_taxrate number; --税率
v_balance number; --差额(计算最后一个层级税额的金额)
v_subtaxamount number; --最后一层税额之前所有层级满额的总和
begin
v_balance := v_totalamount - v_startamount;
if v_balance <= 500 then
v_taxrate := 5;
v_subtaxamount := 0;
v_balance := v_balance - 0;
elsif v_balance <= 2000 then
v_taxrate := 10;
v_subtaxamount := 25;
v_balance := v_balance - 500;
elsif v_balance <= 5000 then
v_taxrate := 15;
v_subtaxamount := 175;
v_balance := v_balance - 2000;
elsif v_balance <= 20000 then
v_taxrate := 20;
v_subtaxamount := 625;
v_balance := v_balance - 5000;
elsif v_balance <= 40000 then
v_taxrate := 25;
v_subtaxamount := 3625;
v_balance := v_balance - 20000;
elsif v_balance <= 60000 then
v_taxrate := 30;
v_subtaxamount := 8625;
v_balance := v_balance - 40000;
elsif v_balance <= 80000 then
v_taxrate := 35;
v_subtaxamount := 14625;
v_balance := v_balance - 60000;
elsif v_balance <= 100000 then
v_taxrate := 40;
v_subtaxamount := 21625;
v_balance := v_balance - 80000;
elsif v_balance > 100000 then
v_taxrate := 45;
v_subtaxamount := 29625;
v_balance := v_balance - 100000;
end if;
v_taxamount := v_balance * v_taxrate / 100 + v_subtaxamount;
return v_taxamount;
end get_taxamount;
你执行一下,然后运行:
select get_taxamount(18000,1600) from dual --18000是薪水总额,1600是起征额。
加分加分~~
展开全部
create or replace function ATESTHL(N_IN Integer) return varchar2 is
ReturnValue number(18,2);
begin
-- Test statements here
if N_IN <= 500 then
select (N_IN*0.05) into ReturnValue from dual;
end if;
if N_IN > 500 and N_IN <= 2000 then
select (N_IN*0.1) into ReturnValue from dual;
end if;
if N_IN > 2000 and N_IN <= 5000 then
select N_IN*0.15 into ReturnValue from dual;
end if;
if N_IN > 5000 and N_IN <= 20000 then
select N_IN*0.2 into ReturnValue from dual;
end if;
if N_IN > 20000 and N_IN <= 40000 then
select N_IN*0.25 into ReturnValue from dual;
end if;
if N_IN > 40000 and N_IN <= 60000 then
select N_IN*0.3 into ReturnValue from dual;
end if;
if N_IN > 60000 and N_IN <= 80000 then
select N_IN*0.35 into ReturnValue from dual;
end if;
if N_IN > 80000 and N_IN <= 100000 then
select N_IN*0.4 into ReturnValue from dual;
end if;
if N_IN > 100000 then
select N_IN*0.45 into ReturnValue from dual;
end if;
return (ReturnValue);
end;
ReturnValue number(18,2);
begin
-- Test statements here
if N_IN <= 500 then
select (N_IN*0.05) into ReturnValue from dual;
end if;
if N_IN > 500 and N_IN <= 2000 then
select (N_IN*0.1) into ReturnValue from dual;
end if;
if N_IN > 2000 and N_IN <= 5000 then
select N_IN*0.15 into ReturnValue from dual;
end if;
if N_IN > 5000 and N_IN <= 20000 then
select N_IN*0.2 into ReturnValue from dual;
end if;
if N_IN > 20000 and N_IN <= 40000 then
select N_IN*0.25 into ReturnValue from dual;
end if;
if N_IN > 40000 and N_IN <= 60000 then
select N_IN*0.3 into ReturnValue from dual;
end if;
if N_IN > 60000 and N_IN <= 80000 then
select N_IN*0.35 into ReturnValue from dual;
end if;
if N_IN > 80000 and N_IN <= 100000 then
select N_IN*0.4 into ReturnValue from dual;
end if;
if N_IN > 100000 then
select N_IN*0.45 into ReturnValue from dual;
end if;
return (ReturnValue);
end;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询