SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 736|回复: 3
打印 上一主题 下一主题

请教一个关于有累计限额的报销问题

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2009-9-1 21:45:58 | 只看该作者

请教一个关于有累计限额的报销问题

数据如下列所示, 同一人员编号按时间排了序,起付额为1000元,报销比例是0.9,即 报销额=( 费用-1000)*0.9 ,每人年度累计最高报销4万元,以后发生的费用不报销,请问用sas如何求得"报销额'这一列数?

人员编号        费用        报销额(累计最高4万)
1005295        9956.21        8060.59
1005321        11242.38        9218.14
1005321        8630.66        6867.59
1005341        10215.13        8293.62
1005342        9921.61        8029.45
1005343        34442.14        30097.93
1005344        18849.58        16064.62
1005345        5875.3        4387.77
1005345        3232.32        2009.09
1005355        6716.88        5145.19
1005379        8322.66        6590.39
1005380        3077.02        1869.32
1005385        9251.08        7425.97
1005396        6481.91        4933.72
1005428        5066.98        3660.28
1005435        1756.32        680.69
1005447        6710.21        5139.19
1005448        6094.58        4585.12
1005457        7173.63        5556.27
1005474        46816.8        40000.00
1005474        13456.25        0.00
1005474        1021.61        0.00
1005474        3712.81        0.00
1005474        14249.66        0.00
1005474        417.28        0.00
1005484        11302.7        9272.43
1005488        5005.71        3605.14
1005488        8824.12        7041.71
1005501        26136.04        22622.44
1005501        19119.94        16307.95
1005501        13882.95        1069.62
1005501        15710.7        0.00
1005501        15313.92        0.00
1005501        14336.68        0.00
1005501        13943.59        0.00
1005501        13974.47        0.00
1005501        14599.82        0.00
1005501        14232.53        0.00
1005501        14662.14        0.00
1005501        14694.78        0.00
1005501        19877.12        0.00
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2009-9-1 23:56:00 | 只看该作者

Re: 请教一个关于有累计限额的报销问题

[code:3tcs9wqi]data raw;
        input employee_id expenses standard;
datalines;
1005295 9956.21 8060.59
1005321 11242.38 9218.14
1005321 8630.66 6867.59
1005341 10215.13 8293.62
1005342 9921.61 8029.45
1005343 34442.14 30097.93
1005344 18849.58 16064.62
1005345 5875.3 4387.77
1005345 3232.32 2009.09
1005355 6716.88 5145.19
1005379 8322.66 6590.39
1005380 3077.02 1869.32
1005385 9251.08 7425.97
1005396 6481.91 4933.72
1005428 5066.98 3660.28
1005435 1756.32 680.69
1005447 6710.21 5139.19
1005448 6094.58 4585.12
1005457 7173.63 5556.27
1005474 46816.8 40000.00
1005474 13456.25 0.00
1005474 1021.61 0.00
1005474 3712.81 0.00
1005474 14249.66 0.00
1005474 417.28 0.00
1005484 11302.7 9272.43
1005488 5005.71 3605.14
1005488 8824.12 7041.71
1005501 26136.04 22622.44
1005501 19119.94 16307.95
1005501 13882.95 1069.62
1005501 15710.7 0.00
1005501 15313.92 0.00
1005501 14336.68 0.00
1005501 13943.59 0.00
1005501 13974.47 0.00
1005501 14599.82 0.00
1005501 14232.53 0.00
1005501 14662.14 0.00
1005501 14694.78 0.00
1005501 19877.12 0.00
;

%let base=1000;
%let rate=0.9;
%let max_reimbursement=40000;

data temp(drop=temp quota);
        do _n_=1 by 1 until(last.employee_id);
                set raw;
                by employee_id;
                temp=ifn(expenses>&base,(expenses-&base)*&rate,0);
                if _n_=1 then quota=&max_reimbursement-temp;
                        else quota=quota-temp;
                if quota<0 then reimbursement=round(ifn(quota+temp>0,quota+temp,0),0.01);
                        else reimbursement=round(temp,0.01);
                output;
        end;
run;[/code:3tcs9wqi]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2009-9-2 23:24:51 | 只看该作者

Re: 请教一个关于有累计限额的报销问题

谢谢 hopewell !
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2009-9-6 20:51:34 | 只看该作者

Re: 请教一个关于有累计限额的报销问题

data raw ;
   input employee_id expenses standard;
   label employee_id='人员编号'
         expenses='费用';
                 standard='报销金额';
datalines;
1005295 9956.21 8060.59
1005321 11242.38 9218.14
1005321 8630.66 6867.59
1005341 10215.13 8293.62
1005342 9921.61 8029.45
1005343 34442.14 30097.93
1005344 18849.58 16064.62
1005345 5875.3 4387.77
1005345 3232.32 2009.09
1005355 6716.88 5145.19
1005379 8322.66 6590.39
1005380 3077.02 1869.32
1005385 9251.08 7425.97
1005396 6481.91 4933.72
1005428 5066.98 3660.28
1005435 1756.32 680.69
1005447 6710.21 5139.19
1005448 6094.58 4585.12
1005457 7173.63 5556.27
1005474 46816.8 40000.00
1005474 13456.25 0.00
1005474 1021.61 0.00
1005474 3712.81 0.00
1005474 14249.66 0.00
1005474 417.28 0.00
1005484 11302.7 9272.43
1005488 5005.71 3605.14
1005488 8824.12 7041.71
1005501 26136.04 22622.44
1005501 19119.94 16307.95
1005501 13882.95 1069.62
1005501 15710.7 0.00
1005501 15313.92 0.00
1005501 14336.68 0.00
1005501 13943.59 0.00
1005501 13974.47 0.00
1005501 14599.82 0.00
1005501 14232.53 0.00
1005501 14662.14 0.00
1005501 14694.78 0.00
1005501 19877.12 0.00
;
run;
data reimburse (drop=a reimburse_sum );
reimburse_sum=0;
_ido _n_=1 by 1 until(last.employeed );
set raw;
by employee_id;
if reimburse_sum<40000 then do;
a=reimburse_sum;
if expenses>=1000 then reimburse=(expenses-1000)*0.9;
else reimburse=0;
if reimburse>40000 then reimburse=40000;
reimburse_sum=reimburse_sum+reimburse;
if reimburse_sum>40000 then reimburse=40000-a;
end;
else
reimburse=0;
reimburse=round(reimburse,0.01);
output;
end;
run;
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2026-2-6 00:59 , Processed in 0.146365 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表