楼主: wxmouse
1642 7

请教如何批量更新数据表的问题!!求助求助!!! [推广有奖]

  • 0关注
  • 1粉丝

本科生

93%

还不是VIP/贵宾

-

威望
0
论坛币
416 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
1011 点
帖子
54
精华
0
在线时间
130 小时
注册时间
2011-7-20
最后登录
2021-12-7

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
比如:数据表1:  姓名     国籍    性别     学历
                              张三     中国      男     本科
                              李四      美国     女     研究生
                              王五       英国    男     本科
          数据表2(修改明细):    姓名   修改字段   原值    现值
                                            张三    性别          男         女
                                            李四     国籍         中国      美国


如何根据数据表2的修改明细 来更新数据表1中的部分数据?实际数据当然要大的多。


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:求助求助 数据表 部分数据 实际数据 研究生 数据表 记录 如何

回帖推荐

mingfeng07 发表于2楼  查看完整内容

data a; input name $ nation $ sex $ education $; cards; a china man under b Ame woman grd ; run; data b; input name $ id $ oldvalue $ newvalue $; cards; a sex man woman b nation china Ame ; run; data c; merge a b; by name; run; data d; set c; if oldvalue eq nation then nation=newvalue; else if oldvalue eq sex then sex=newvalue; else if oldvalue eq education then education=new ...
沙发
mingfeng07 学生认证  发表于 2014-7-14 03:11:15 |只看作者 |坛友微信交流群
data a;
input name $ nation $ sex $ education $;
cards;
a china man under
b Ame woman grd
;
run;
data b;
input name $ id $ oldvalue $ newvalue $;
cards;
a sex man woman
b nation china Ame
;
run;
data c;
merge a b;
by name;
run;
data d;
set c;
if oldvalue eq nation then nation=newvalue;
else if oldvalue eq sex then sex=newvalue;
else if oldvalue eq education then education=newvalue;
run;

使用道具

藤椅
wxmouse 发表于 2014-7-14 09:20:52 |只看作者 |坛友微信交流群
非常感谢,先学习下,有问题再请教[em23]

使用道具

板凳
wxmouse 发表于 2014-7-23 14:13:10 |只看作者 |坛友微信交流群
mingfeng07 发表于 2014-7-14 03:11
data a;
input name $ nation $ sex $ education $;
cards;
问题来了,当表a和表b  merge合并时是一对一的关系式可以的,如果是一对多就会出问题,比如表b中李四不光国籍需要修改,性别也要修改,即源代码中b表多了“b sex woman man”这么一列,结果会出现重复观测(李四的),而需求是每个id只能有一条记录,这个有什么办法呢?也就是不同修改记录能不能整合到原数据表同一观测的不同变量?
不知道表达的是否清楚?

使用道具

报纸
mingfeng07 学生认证  发表于 2014-7-23 18:35:30 |只看作者 |坛友微信交流群
wxmouse 发表于 2014-7-23 14:13
问题来了,当表a和表b  merge合并时是一对一的关系式可以的,如果是一对多就会出问题,比如表b中李四不光 ...
  1. data a;
  2. input name $ nation $ sex $ education $;
  3. cards;
  4. a china man under
  5. b china woman grd
  6. c Ame man under
  7. ;
  8. run;
  9. data b;
  10. input name $ id $ oldvalue $ newvalue $;
  11. cards;
  12. a sex man woman
  13. b nation china Ame
  14. b sex woman man
  15. b education grd under
  16. c nation Ame china
  17. c sex man woman
  18. ;
  19. run;
  20. proc sort data=a;by name;run;
  21. proc sort data=b;by name;run;
  22. data b1 b2 b3;
  23. set b;
  24. by name;
  25. if first.name then output b1;
  26. else if last.name then output b2;
  27. else output b3;
  28. run;
  29. %macro test;
  30. data test;
  31. set a;
  32. by name;
  33. run;
  34. %do i=1 %to 3;
  35. data test;
  36. merge test b&i.;
  37. by name;
  38. if oldvalue eq nation then nation=newvalue;
  39. else if oldvalue eq sex then  sex=newvalue;
  40. else if oldvalue eq education then education=newvalue;
  41. run;
  42. %end;
  43. proc sql;
  44. alter table test
  45. drop id,oldvalue,newvalue;
  46. quit;
  47. %mend;
  48. %test
复制代码

使用道具

地板
freerunning_sky 在职认证  发表于 2014-7-23 20:15:34 |只看作者 |坛友微信交流群
  1. data a;
  2. input name :$4. nation :$10. sex :$5. education :$10.;
  3. cards;
  4. a china man under
  5. b china woman grd
  6. c Ame man under
  7. ;
  8. run;
  9. data b;
  10. input name :$4. id :$10. oldvalue :$15. newvalue :$15. edit_time;
  11. informat edit_time yymmdd10.;
  12. format edit_time yymmdd10.;
  13. cards;
  14. a sex man woman 2014-07-01
  15. a sex woman man 2014-07-02
  16. b nation china Ame 2014-07-02
  17. b nation Ame Canada 2014-07-03
  18. b sex woman man 2014-07-03
  19. b education grd under 2014-07-04
  20. c nation Ame china 2014-07-04
  21. c sex man woman 2014-07-04
  22. ;
  23. run;

  24. proc sort data=b;by name id edit_time;run;
  25. data c;
  26.         set b;
  27.         by name id edit_time;
  28.         if last.id;
  29. run;

  30. proc transpose data=c out=d(drop=_name_);
  31.         by name;
  32.         id id;
  33.         var newvalue;
  34. run;

  35. data a;
  36.         modify a d;
  37.         by name;
  38.         if _iorc_=0 then replace;
  39. run;
复制代码

使用道具

7
wxmouse 发表于 2014-8-1 15:37:29 |只看作者 |坛友微信交流群
       谢谢以上两位,试了一下都可以,第一个程序因为用的if else 只能输出头、尾、中间,实际我的变量很多,第二个程序是可以的。我自己是用merge 然后通过输出控制(用.last)也达到了目的。
     现在碰到的问题是:现在解决了一对多的问题,实际情况是多对多,也就是说表a同一个人会多次出现,后面还有字段,比如,语文成绩、数学成绩,导致同一个人有好几个观测,而后面这些观测不涉及修改,多对多我看了sas的书,和SQL的原理不一样,merge匹配原理完全不同,而modify只会更新第一条观测。
     我现在唯一的思路是将表a拆成2张表,关键字是name,第一张表就保留前面几个字段(不含语文成绩、数学成绩),然后单独更新,然后两个表再合并。但是好像比较麻烦,不知道还有没有不拆分表直接更新的办法。
      无论如何,太谢谢了!!

使用道具

8
learsaas 发表于 2014-8-1 16:30:00 |只看作者 |坛友微信交流群
一个data步,双set就可以搞定了,一对多,多对多也适用

使用道具

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

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

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

GMT+8, 2024-4-25 11:30