楼主: kongqunyu
5402 4

[有偿编程] 按照列提取数据组成新的表 [推广有奖]

  • 10关注
  • 2粉丝

副教授

37%

还不是VIP/贵宾

-

威望
0
论坛币
2977 个
通用积分
0.4469
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
14735 点
帖子
183
精华
0
在线时间
1274 小时
注册时间
2008-7-16
最后登录
2019-1-7

50论坛币
原料:有这么一堆表,表间的字段有重复的,有总结好的sas数据集,见附件,
table_name就是来源表, unique_name就是要生成的表名,两者是多对一的关系,多个原始表生成一个目标表。

阶段目标:
将表中的共有字段都提取出来,分别组成新的表,即:按照列提取,提取表中相同的列,组成新的表,生成的目标表会有很多。
例子:
从a表里有aa, b表里也有aa,两个aa纵向合并形成一个新的表aa(不去除重复);
从a表里有cc, c表里有cc,b表里有cc, 三个cc纵向合并形成一个新的表cc(不去除重复)……;


可以用下列的语句单个的实现:
proc sql;
create table table3 as
select name from birth1
outer union
select name  from  birth2 ;quit;


最终目标:
批量实现,附件中可以看出非常有规律,希望可以通过宏实现,谢谢大家。




question.xlsx

59.77 KB

总结的表单

最佳答案

intheangel 查看完整内容

没有调试,有问题再联系
关键词:proc sql Select Create unique sas数据集 create
沙发
intheangel 学生认证  发表于 2014-4-23 16:11:54 |只看作者 |坛友微信交流群
没有调试,有问题再联系
  1. %let object=question;/*你给的总结性的数据表*/

  2. %macro a;
  3. %do i=1 %to 871;/*共有871张表,分开来做数据的合并*/

  4. data x;
  5. set &object.;
  6. if a=&i.;
  7. run;/*得到第一组等待合并的数据集信息*/

  8. data y;
  9. set x nobs=n;
  10. if _n_=1;
  11. var=scan(unique_name,1,'_');
  12. call symput('var',var);/*得到待匹配的变量名,并赋值给宏变量var*/
  13. call symput('n',n);/*得到共有多少组数据集要合并,并赋值给宏变量n*/
  14. call symput('name',unique_name);/*得到新的表的名字*/
  15. run;

  16. /*
  17. %put &var.;
  18. %put &n.;
  19. */

  20. data &name.;
  21. &var.=.;
  22. run;

  23. %do j=1 %to &n.;
  24. data x_&j.;
  25. set x;if _n_=&j.;call symput("data_&j",table_name);run;/*分别把要合并的变量名赋值给宏变量data_&j*/


  26. data &name.;
  27. set &name. &&data_&j(keep=&var);
  28. by &var.
  29. run;
  30. %end;
  31. %end;
  32. %mend a;
  33. %a
复制代码
我是一只瘦瘦的小猪~~~
╭︿︿︿╮
{/-◎◎-/}
( (oo) )
  ︶︶︶

使用道具

藤椅
6皮皮9 发表于 2014-4-23 17:37:03 |只看作者 |坛友微信交流群
我看了附件觉得很乱啊,因为数据你自己才有,我看那个表根本就看不明白。
思路:
1、使用dictionary.column这个表,查看不同数据集里面的变量名
2、根据变量名排序,这样就可以看到哪些变量名需要从哪些表格里面批量提取
3、然后结合宏的应用批量生成表格

如果你不需要去重的话,而且相同变量名的数据格式都一样,不会出现数据截断问题的话,可以考虑使用
proc append

使用道具

板凳
kongqunyu 发表于 2014-4-23 20:36:35 |只看作者 |坛友微信交流群
6皮皮9 发表于 2014-4-23 17:37
我看了附件觉得很乱啊,因为数据你自己才有,我看那个表根本就看不明白。
思路:
1、使用dictionary.colu ...
就3列,table_name abc he unique_name

abc相同的说明对应的table_name含有相同的变量 变量的名字都为unique_name,比如:

table_name                          abc          unique_name
BIRTH_DAORUBIAO_2007          1               ABCODE_VARCHAR2
BIRTH_OUT_HOSPITAL2009          1       

意思是从birth_baorubiao_2007和birth_out_hospital2009两张表里面提取 abcode这个变量,组成新的表,新表的表名为abcode_varchar2

使用道具

报纸
jeozu 发表于 2014-4-25 23:15:08 |只看作者 |坛友微信交流群
  1. %let yourlibrary=;
  2. proc sql ;
  3. create table cols as
  4. select  distinct name
  5. from dictionary.columns
  6. where upcase(libname)=upcase("&yourlibrary")
  7. order by name
  8. ;
  9. quit;
  10. %macro aa(cols, library);
  11.     proc sql noprint;
  12.     select memname into :memname separated by '(keep="&cols")  '
  13.     from dictionary.columns
  14.     where upcase(libname)=upcase("&library")
  15.       and upcase(name)   =upcase("&cols");
  16.     data &cols;
  17.       set &memname;
  18.     run;
  19. %mend;
  20. data _null_;
  21.     set cols;
  22.     call execute("%aa("||name||", &yourlibrary)");
  23. run;
复制代码
有问题请反馈。。

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-28 05:24