SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 683|回复: 4
打印 上一主题 下一主题

菜鸟求教一个累计减法的问题

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2009-10-12 23:28:13 | 只看该作者

菜鸟求教一个累计减法的问题

有两个数据集 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
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2009-10-13 08:27:41 | 只看该作者

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]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2009-10-13 09:01:24 | 只看该作者

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]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2009-10-13 20:45:28 | 只看该作者

Re: 菜鸟求教一个累计减法的问题

受教了~
谢谢hopewell和tanzhen_mysas回复~
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2009-10-14 00:22:46 | 只看该作者

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]
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-6 01:08 , Processed in 0.156744 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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