SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 1695|回复: 11
打印 上一主题 下一主题

求助高手:如何根据配制表,来抽取数据,组成宽表?

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2008-9-11 10:52:54 | 只看该作者

求助高手:如何根据配制表,来抽取数据,组成宽表?

根据配制表,来抽取数据,组成宽表.比如现在有三个原始表class1,class2,class3和一个配制表confect.现在根据配制表confect的内容,在三个原始表里取相应的字段,结成宽表taball;数据如下:
data class1(rename=(name=name1 sex=sex1 age=age1 height=height1 weight=weight1));
set sashelp.class;
run;
data class2(rename=(name=name2 sex=sex2 age=age2 height=height2 weight=weight2));
set sashelp.class;
run;
data class3(rename=(name=name3 sex=sex3 age=age3 height=height3 weight=weight3));
set sashelp.class;
run;
data confect;
input tabName $ colName $ ;
     DATALINES;
         class1  name1
         class1  age1
         class2  name2
         class2  age2
         class3  name3
         class3  age3
run;
最后的宽表taball的列有class1.name1,class1.age1,class2.name2,class2.age2,class3.name3,class3.age3
请求高手给点指导,谢谢!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2008-9-16 11:20:56 | 只看该作者

Re: 求助高手:如何根据配制表,来抽取数据,组成宽表?

data class1(rename=(sex=sex1 age=age1 height=height1 weight=weight1));
set sashelp.class;
run;
data class2(rename=(sex=sex2 age=age2 height=height2 weight=weight2));
set sashelp.class;
run;
data class3(rename=(sex=sex3 age=age3 height=height3 weight=weight3));
set sashelp.class;
run;
data confect;
input storeName $ tabName $ colName $ ;
     DATALINES;
         sashelp  class  name
         sashelp  class  age
         work          class1 age1
         work          class1 sex1
         work     class2  sex2
         work     class2  age2
         work     class3  height3
         work     class3  age3
         work     class3  weight3
run;
options mprint mlogic;
%macro meageTable(tab,tid);
%let dsid=%sysfunc(open(&tab,i));
%let Totnum=%sysfunc(attrn(&dsid,NOBS));
%let lcname=  twhere=  stname=  storetable= ;
        %do seq= 1 %to  %eval(&Totnum);
                %let rc=%sysfunc(fetchobs(&dsid,&seq));
                %let store=%sysfunc(getvarc(&dsid,1));
                %let tname=%sysfunc(getvarc(&dsid,2));
        %let cname=%sysfunc(getvarc(&dsid,3));
                data _null_;
                        call symput('storetable',"&store"||"."||"&tname"||" "||"&store"||"&tname");
                run;
                %if &seq=1 %then %do;
                        data _null_;
                                call symput('stname',"&storetable");
                                call symput('lcname',"&tname"||"."||"&cname");
                                call symput('twhere',"&store"||"&tname"||"."||"&tid");
                        run;
                %end;
                %else %do;
                        %let a=%index("&stname",&storetable);
                        %if &a>0 %then %do;
                                data _null_;
                                        call symput('lcname',"&lcname" ||","||"&tname"||"."||"&cname");
                                run;
                        %end;
                        %else %do;
                                data _null_;
                                        call symput('stname',"&stname" || "," || "&storetable");
                                        call symput('lcname',"&lcname" ||","||"&tname"||"."||"&cname");
                                        call symput('twhere',"&twhere"||"="||"&store"||"&tname"||"."||"&tid");
                                run;
                        %end;
                        %put "lcname============================" &lcname;
                        %put "stname============================" &stname;
                        %put "twhere============================" &twhere;
                %end;
        %end;
        proc sql;
                create table classall as
                        select &lcname from &stname
                        where &twhere;
        quit;
%mend meageTable;
%meageTable(work.confect,name);

这是我写的代码,功能是实现了,但觉得代码不够简化,大家指教一下,那些地方可以优化的?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2008-9-24 17:32:23 | 只看该作者

Re: 求助高手:如何根据配制表,来抽取数据,组成宽表?

<!-- s:shock: --><img src="{SMILIES_PATH}/icon_eek.gif" alt=":shock:" title="Shocked" /><!-- s:shock: -->
            为什么我的问题只有我自己在唱独角戏呢?是不是我表达的不够明确或是表达能力有问题?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2008-9-26 11:29:02 | 只看该作者

Re: 求助高手:如何根据配制表,来抽取数据,组成宽表?

太长了,我看看先
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2008-9-26 14:16:46 | 只看该作者

Re: 求助高手:如何根据配制表,来抽取数据,组成宽表?

我很喜欢“宽表”这种白痴一样通俗的新词,所以回你一贴。
[code:2ez6j1ml]data _null_;
  set confect end=end;
  file 'c&#58;\temp&#46;txt';
  if _n_=1 then put 'data taball; merge ';
  length commmand $200;
  command=compress(tabname||'(keep='||colname||')');
  put command;
  if end then put '; run;';

run;

%include 'c&#58;\temp&#46;txt';[/code:2ez6j1ml]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2008-9-26 16:29:25 | 只看该作者

Re: 求助高手:如何根据配制表,来抽取数据,组成宽表?

楼上的代码太精点了,多谢!!!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
7#
 楼主| 发表于 2008-9-27 11:56:09 | 只看该作者

Re: 求助高手:如何根据配制表,来抽取数据,组成宽表?

[color=#BF0000:5wklhnxs]to ahuige [/color:5wklhnxs]
用merge做表合并的话,如果要用到by name,那compress好像不行啊.
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
8#
 楼主| 发表于 2008-9-27 13:06:31 | 只看该作者

Re: 求助高手:如何根据配制表,来抽取数据,组成宽表?

[quote=&quot;ydlin&quot;:d73xwkil][color=#BF0000:d73xwkil]to ahuige [/color:d73xwkil]
用merge做表合并的话,如果要用到by name,那compress好像不行啊.[/quote:d73xwkil]

没用的家伙,出去不要说我回过你的贴
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
9#
 楼主| 发表于 2008-9-27 13:16:16 | 只看该作者

Re: 求助高手:如何根据配制表,来抽取数据,组成宽表?

回楼上的大哥:
不是我没用啊,
data taball;
merge
sashelp.class(keep=name)
sashelp.class(keep=age)
work.class1(keep=sex1)
work.class2(keep=age2)
work.class3(keep=weight3)
;
by name;
run;
这样的语句是错误的,如果要用by name做条件合并的话,每个keep里都要有name的啊.
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
10#
 楼主| 发表于 2008-9-27 13:35:05 | 只看该作者

Re: 求助高手:如何根据配制表,来抽取数据,组成宽表?

[code:2wgab1id]data _null_;
  set confect end=end;
  file 'c&#58;\temp&#46;txt';
  if _n_=1 then put 'data taball; merge ';
  length commmand $200;
  command=tabname||'(keep=name '||colname||')';
  put command;
  if end then put ';by name; run;';

run;

%include 'c&#58;\temp&#46;txt';[/code:2wgab1id]

朽木不可雕也
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-5 03:24 , Processed in 0.071484 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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