SAS中文论坛

标题: 菜鸟求教一个累计减法的问题 [打印本页]

作者: shiyiming    时间: 2009-10-12 23:28
标题: 菜鸟求教一个累计减法的问题
有两个数据集 a ,b
data a;
        input id $ time1 monyy7. own_money;
        format time1 monyy7.;
        datalines;
001 JAN2007 1000
002 JAN2007 1500
003 FEB2007 2000
004 FEB2007 1500

data b;
        input id $ time2 monyy7. pay_money;
        format time2 monyy7.;
        datalines;
001 FEB2007 200
001 APR2007 200
002 MAR2007 100
003 FEB2007 400
003 JUN2007 200
004 OCT2007 300
;

可以通过
proc sql;
        create table d as
                select coalesce(a.id, b.id) as ID, own_money-sum_money as sub
                from a
                full join
                        (select id,  sum(pay_money) as sum_money
                        from b
                        group by id)
                on a.id=b.id;
quit;
生成2007的累计差额:
Obs    ID      sub
1     001     600
2     002    1400
3     003    1400
4     004    1200

请问如何生成这样一组数据,它由id,付款月,该月的欠款组成。

001 FEB2007 800
001 APR2007 600
002 MAR2007 1400
003 FEB2007 1600
003 JUN2007 1400
004 OCT2007 1200
作者: shiyiming    时间: 2009-10-13 08:27
标题: Re: 菜鸟求教一个累计减法的问题
先抛块砖,应该还有更好的法子
[code:30dcymst]data a;
        input id $ time1 monyy7. own_money;
        format time1 monyy7.;
datalines;
001 JAN2007 1000
002 JAN2007 1500
003 FEB2007 2000
004 FEB2007 1500
;

data b;
        input id $ time2 monyy7. pay_money;
        format time2 monyy7.;
datalines;
001 FEB2007 200
001 APR2007 200
002 MAR2007 100
003 FEB2007 400
003 JUN2007 200
004 OCT2007 300
;

data temp;
        set a(rename=(time1=time own_money=money))
                b(rename=(time2=time pay_money=money) in=b);
        if b then money=-money;
run;

proc sort data=temp;
        by id time;
run;

data temp(drop=money);
        do _n_=1 by 1 until(last.id);
                set temp;
                by id;
                sum_money=sum(sum_money,money);
                if _n_ ne 1 then output;
        end;
run;[/code:30dcymst]
作者: shiyiming    时间: 2009-10-13 09:01
标题: Re: 菜鸟求教一个累计减法的问题
有趣,我也拍块砖,每个月的都能看到,如果想只看最后结果,把“/*if last.id then output;*/”前后的“/*”去掉就行了:
[code:15yog556]data a;
input id $ time1 monyy7. own_money;
format time1 monyy7.;
datalines;
001 JAN2007 1000
002 JAN2007 1500
003 FEB2007 2000
004 FEB2007 1500
;
run;
data b;
input id $ time2 monyy7. pay_money;
format time2 monyy7.;
datalines;
001 FEB2007 200
001 APR2007 200
002 MAR2007 100
003 FEB2007 400
003 JUN2007 200
004 OCT2007 300
;
run;

data b;
        set b;
        rename time2=time1;
run;

proc sort data=a; by id time1;run;
proc sort data=b; by id time1;run;

data sum;
        merge a b;
        retain money;
        by id time1;
        if first.id then do;
                if pay_money eq . then money=own_money;
                else money=own_money-pay_money;
        end;
        else money=money-pay_money;
/*if last.id then output;*/
run;[/code:15yog556]
作者: shiyiming    时间: 2009-10-13 20:45
标题: Re: 菜鸟求教一个累计减法的问题
受教了~
谢谢hopewell和tanzhen_mysas回复~
作者: shiyiming    时间: 2009-10-14 00:22
标题: Re: 菜鸟求教一个累计减法的问题
呵呵 受启发自己也编了个

[code:22r5ovom]data a;
input id $ time1 monyy7. own_money;
format time1 monyy7.;
datalines;
001 JAN2007 1000
002 JAN2007 1500
003 FEB2007 2000
004 FEB2007 1500
;
run;
data b;
input id $ time2 monyy7. pay_money;
format time2 monyy7.;
datalines;
001 FEB2007 200
001 APR2007 200
002 MAR2007 100
003 FEB2007 400
003 JUN2007 200
004 OCT2007 300
;
run;

proc sql;
        create table j as
        select a.id, time1,time2,own_money,0-pay_money as pay_money
        from a, b
        where a.id=b.id;
quit;
proc print data=j;
run;
proc sort data=j;
by id time2;
run;
data k (keep=id time2 sum);
        set j (drop=time1);
        by id time2;
        if first.id then sum=own_money;
        sum+pay_money;

run;
proc print data=k;
run;[/code:22r5ovom]




欢迎光临 SAS中文论坛 (https://mysas.net/forum/) Powered by Discuz! X3.2