SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

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

问一个根据多个表生成数据的问题

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2010-10-29 20:57:38 | 只看该作者

问一个根据多个表生成数据的问题

假设我有以下三个表account,a,b,其中account是总表,a和b是两个分表,a和b中有些ID可能是重复的。
我现在需要再表account加上两个变量var1,var2,如果ID来自于表a,那么var1 =1,否则var1 =0;同样,如果ID来自于表b,那么var2 =1,否则var2 =0。
谢谢高手~

data account;
input ID;
cards;
001
002
003
004
005
006
007
008
009
;

data a;
input ID;
cards;
001
002
003
007
008
009
;

data b;
input ID;
cards;
001
002
003
004
005
006
;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2010-10-29 23:02:36 | 只看该作者

Re: 问一个根据多个表生成数据的问题

[code:28kdf9cv]data a;
    input ID;
cards;
001
002
003
007
008
009
;
data b;
    input ID;
cards;
001
001
002
003
004
005
006
;
data account;
    input ID;
cards;
001
002
003
004
005
006
007
008
009
;
data out;
    if _n_=1 then do;
        declare hash a(hashexp:16,dataset:'a',ordered:'yes');
        a.defineKey('id');
        a.defineDone();
        declare hash b(hashexp:16,dataset:'b',ordered:'yes');
        b.defineKey('id');
        b.defineDone();
    end;
    set account;
    var1=ifn(a.find(),0,1);
    var2=ifn(b.find(),0,1);
run;[/code:28kdf9cv]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2010-10-30 09:38:16 | 只看该作者

Re: 问一个根据多个表生成数据的问题

sql也可以实现吧。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2010-10-30 19:38:26 | 只看该作者

Re: 问一个根据多个表生成数据的问题

data account;
input ID;
cards;
001
002
003
004
005
006
007
008
009
;

data a;
input ID;
cards;
001
002
003
007
008
009
;

data b;
input ID;
cards;
001
002
003
004
005
006
;
proc sql;
create table result as
select id,1 as var1 from account where id in (select id from a )
union
select id ,0 as var1 from account where id not in (select id from a);
create table result as
select id ,var1,1 as var2 from result where id  in (select id from b)
union
select id ,var1 ,0 as var2 from result where id not in (select id from b);
quit;
proc print;
run;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2010-10-30 19:40:02 | 只看该作者

Re: 问一个根据多个表生成数据的问题

hopewell确实写的好
SQL实现我写了一个
不过感觉还可以优化一下
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2010-10-31 10:10:42 | 只看该作者

Re: 问一个根据多个表生成数据的问题

两位都是高手,谢谢~ <!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D -->
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
7#
 楼主| 发表于 2010-11-1 23:05:22 | 只看该作者

Re: 问一个根据多个表生成数据的问题

to ganshenme
like SASsy way to code this:

proc sql;
       create view accountv as
       select * from account order by id;
       create view av as
       select * from a order by id;
       create view bv as
       select * from b order by id;
quit;
data new;
       merge accountv(in=_1)  av(in=_a)  bv(in=_b);
       by ID;
       var1=(_a=1);  var2=(_b=1);
       if _1;
run;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
8#
 楼主| 发表于 2010-11-21 23:57:38 | 只看该作者

Re: 问一个根据多个表生成数据的问题

[code:2z03jzxr]
/*STEP1&#58; CREATE A FORMAT TO INDICATE Y/N*/
proc format;
        value define            &#46; = 0
                                          other =  1
        ;
run;
/*STEP2&#58; LEFT JOIN THE THREE TABLES*/
proc sql;
        select  account&#46;id, a&#46;id as var1 format=define&#46;, b&#46;id as var2 format=define&#46;
        from  account  left join a on account&#46;id = a&#46;id
                              left join b on  account&#46;id = b&#46;id
        ;
quit;
********************TEST PASSED***********************;       
[/code:2z03jzxr]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
9#
 楼主| 发表于 2010-11-22 00:17:49 | 只看该作者

Re: 问一个根据多个表生成数据的问题

to oloolo
原来data step也能merge三个dataset啊,受教了。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
10#
 楼主| 发表于 2010-11-22 09:57:37 | 只看该作者

Re: 问一个根据多个表生成数据的问题

小弟也试着写了一下上面的程序,请高手指正哈~-~
[code:r878dgef]data account;
input ID;
cards;
001
002
003
004
005
006
007
008
009
;
data a;
input ID;
cards;
001
002
003
007
008
009
;
data b;
input ID;
cards;
001
002
003
004
005
006
;
proc sql;
   create table  result as
   select id,id in(select id from a) as var1,id in(select id from b) as var2
   from account;
quit;[/code:r878dgef]
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-3 14:53 , Processed in 0.108928 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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