SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 1020|回复: 6
打印 上一主题 下一主题

请教大家一个问题

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2007-12-25 17:01:51 | 只看该作者

请教大家一个问题

现在有sas数据集格式如下:
acct_id       date       vol    trade_dir
A00100  20070102    100   B
A00101  20070102    100   s
A00102  20070102    100   B
A00103  20070103    100   s
A00104  20070102    100   B
A00101  20070102    100   s
A00102  20070104   100   B
A00103  20070102    100   s
A00104  20070105    100   B
A00120  20070102    100   s
A00100  20070106    100   B
......

现在需要编制这样一个的一个程序:计算每一个不同的日期,所有投资者当天相同trade_dir方向的所有vol;
即:创建一张新表,表中格式如下

例如:date             B     S      

      20070102   300   400

  20070103    0       100

请大家给予帮忙
谢谢.
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2007-12-25 19:12:27 | 只看该作者

Re: 请教大家一个问题

用retain也行,不用也行,都可以实现。
data a;
input acct_id $ date vol trade_dir $;
cards;
A00100 20070102 100 B
A00101 20070102 100 S
A00102 20070102 100 B
A00103 20070103 100 S
A00104 20070102 100 B
A00101 20070102 100 S
A00102 20070104 100 B
A00103 20070102 100 S
A00104 20070105 100 B
A00120 20070102 100 S
A00100 20070106 100 B
run;
proc sort data=a;
by date;
run;
data result(keep=date total1 total2 rename=(total1=B total2=S));
set a end=last;
by date;
if first.date then do;
        total1=0;
        total2=0;
end;
if trade_dir='B' then total1+vol;
else if trade_dir='S' then total2+vol;
if last.date;
run;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2007-12-25 21:46:48 | 只看该作者

Re: 请教大家一个问题

proc sort data=a;
by date;
run;

data b(drop=vol trade_dir);
set a(drop=acct_id);
by date;
retain B S;
if first.date then do;
        B=0;S=0;
end;
if trade_dir='B' then B+vol;
else if trade_dir='S' then S+vol;
if last.date then output;
run;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2007-12-26 09:11:56 | 只看该作者

Re: 请教大家一个问题

那么如果对每一个帐户每天该如何计算那?
即:
acct_id   date  B  S

A001001 20070102 100 100
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2007-12-26 21:16:31 | 只看该作者

Re: 请教大家一个问题

proc sort data=a;
by acct_id date;
run;

data b(drop=vol trade_dir);
set a;
by acct_id date;
retain B S;
if first.date then do;
B=0;S=0;
end;
if trade_dir='B' then B+vol;
else if trade_dir='S' then S+vol;
if last.date then output;
run;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2008-1-11 15:03:28 | 只看该作者

Re: 请教大家一个问题

infile data...

proc tabulate data=data out=outdata;
        class date trade_dir;
        var vol;
        table date,trade_dir*vol*sum;
run;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
7#
 楼主| 发表于 2008-1-12 09:38:44 | 只看该作者

Re: 请教大家一个问题

[code:38fyrnbk]data a;
input acct_id $ date vol trade_dir $;
cards;
A00100 20070102 100 B
A00101 20070102 100 S
A00102 20070102 100 B
A00103 20070103 100 S
A00104 20070102 100 B
A00101 20070102 100 S
A00102 20070104 100 B
A00103 20070102 100 S
A00104 20070105 100 B
A00120 20070102 100 S
A00100 20070106 100 B
run;
proc sql;
create table b1 as
select distinct acct_id,date,case trade_dir when 'B' then sum(vol) else 0 end as B1,
case trade_dir when 'S' then sum(vol) else 0 end as S1 from a
group by acct_id,date,trade_dir;
create table b as
select  acct_id,date,sum(b1) as B ,sum(s1) as S from b1
group by acct_id,date;
quit;[/code:38fyrnbk]
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-4 12:10 , Processed in 0.140847 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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