楼主: wayne0524
2645 12

[原创博文] 高手进! [推广有奖]

  • 25关注
  • 6粉丝

已卖:1370份资源

讲师

40%

还不是VIP/贵宾

-

威望
0
论坛币
4534 个
通用积分
8.4306
学术水平
30 点
热心指数
44 点
信用等级
30 点
经验
8310 点
帖子
367
精华
0
在线时间
488 小时
注册时间
2007-2-3
最后登录
2022-11-2

楼主
wayne0524 发表于 2012-6-12 00:06:49 |AI写论文
30论坛币
求助,我用左连接,匹配不上的不显示为 “.” 都显示为“0”了   和原本匹配为0的那些混淆了,怎么办?
求高手指点!

我的意思就是 匹配不上的那些 让他们显示为“.”  而不显示为0,让我能区分清是否匹配上,

请问应该如何设置左连接过来的列的格式 或者在代码的那些方面注意来实现?
原代码如下:
                                                                                                                                       
proc sql;                                                                                                                              
create table  tiaozh.wJ_FCSY2_201205 as                                                                                                
select  a.*                                                                                                                             
       ,b._col12                                                                                                                                                                                     from  tiaozh.wJ_FCSY1_201205 a left join  tiaozh.WJ_2011_FCSY1  b on                                                            
       a._col3=b._col5;                                                                                                                 
       quit;

最佳答案

李金玲 查看完整内容

你的SAS 的option missing 改了吧? 运行 option missing=. ; 即可!
关键词:left join proc sql Select Create creat

沙发
李金玲 发表于 2012-6-12 00:06:50
你的SAS 的option missing 改了吧?
运行 option missing=. ;
即可!
李经纶

藤椅
情迷仲夏夜 发表于 2012-6-12 01:53:21
  1. data wJ_FCSY1_201205;
  2.    input _col3 b;
  3. cards;
  4. 01 12
  5. 02 0
  6. 03 15
  7. 04 11
  8. ;
  9. proc print;run;

  10. data WJ_2011_FCSY1;
  11.    input _col5 _col12;
  12. cards;
  13. 01 20
  14. 02 21
  15. 03 0
  16. 05 0
  17. ;
  18. proc print;run;

  19. proc sql;
  20.    create table wJ_FCSY2_201205 as
  21.    select  a.*,b._col12
  22.    from wJ_FCSY1_201205 a left join WJ_2011_FCSY1 b
  23.    on a._col3=b._col5;
  24. quit;
  25. proc print;run;
复制代码

板凳
wayne0524 发表于 2012-6-12 17:50:05
情迷仲夏夜 发表于 2012-6-12 01:53
大哥,你还是没有解决我提出的问题啊。。。。我的意思就是你写的这段程序,跑完了以后当时查看是能分出来 0 和“.”,但是再继续操作一会儿 再到回来看连接后的清单,“.”就全变成 0 了。。。如和解决这个问题,让“.”保持不变?  

报纸
可~乐 发表于 2012-6-12 23:32:31
不知道像这样是否可以,连接之后生成个标志变量flag,匹配不上的显示为0,匹配上的显示为1。。。
  1. data wJ_FCSY1_201205;
  2.    input $ _col3 b;
  3. cards;
  4. 01 12
  5. 02 0
  6. 03 15
  7. 04 11
  8. ;

  9. data WJ_2011_FCSY1;
  10.    input _col3 $  _col12;
  11. cards;
  12. 01 20
  13. 02 21
  14. 03 0
  15. 05 0
  16. ;

  17. data test;
  18.         merge wJ_FCSY1_201205(in=left) WJ_2011_FCSY1(in=right);
  19.         by _col3;
  20.         if left=right then flag="1";else flag="0";
  21.         if left;
  22. run;
复制代码

地板
wayne0524 发表于 2012-6-12 23:37:49
可~乐 发表于 2012-6-12 23:32
不知道像这样是否可以,连接之后生成个标志变量flag,匹配不上的显示为0,匹配上的显示为1。。。
你这方和我现在用的思想一样哇。。多连接一个其他字段来区分。。。可是我就想能不能就通过设置列属性什么的来实现呢。。。
或者,这本身就是个软件版本不够完善的问题。。。

7
可~乐 发表于 2012-6-12 23:49:24
wayne0524 发表于 2012-6-12 17:50
大哥,你还是没有解决我提出的问题啊。。。。我的意思就是你写的这段程序,跑完了以后当时查看是能分出来 ...
那你是做了什么操作,让“.”变成为了0呢??

8
情迷仲夏夜 发表于 2012-6-12 23:51:26
wayne0524 发表于 2012-6-12 17:50
大哥,你还是没有解决我提出的问题啊。。。。我的意思就是你写的这段程序,跑完了以后当时查看是能分出来 ...
那这个问题就不是出现在这步proc sql上了。因为运行完proc sql,你去查验,原来的零还是零,匹配后没有被赋值的仍然是"."。我建议你应在匹配后"再继续操作一会儿"那几步上查验一下!
如果仍不能保险,你可以在运行proc sql后,用一个变量标明一下:
  1. data chk;
  2.    set wJ_FCSY2_201205;
  3.    if _col12=0 then old=1;if _col12=. then old=0;
  4. proc print;run;
复制代码
一旦发现问题,再重新标注成"."。

9
情迷仲夏夜 发表于 2012-6-13 00:04:36
可~乐 发表于 2012-6-12 23:32
不知道像这样是否可以,连接之后生成个标志变量flag,匹配不上的显示为0,匹配上的显示为1。。。
merge的办法只对"一对一或一对多",但却不适合"多对多":
  1. data wJ_FCSY1_201205;
  2.    input _col3 b;
  3. cards;
  4. 01 12
  5. 02 0
  6. 03 15
  7. 04 11
  8. 01 14
  9. 02 9
  10. ;
  11. proc print;run;

  12. data WJ_2011_FCSY1;
  13.    input _col3 _col12;
  14. cards;
  15. 01 20
  16. 02 21
  17. 03 0
  18. 05 0
  19. 02 0
  20. 05 10
  21. ;
  22. proc print;run;
复制代码
结果用proc sql
  1. proc sql;
  2.    create table chk as
  3.    select  a.*,b._col12
  4.    from wJ_FCSY1_201205 a left join WJ_2011_FCSY1 b
  5.    on a._col3=b._col3;
  6. quit;
  7. proc print data=chk;run;
复制代码
是:

Obs    _col3     b    _col12
1       1      12      20
2       1      14      20
3       2       0      21
4       2       9      21
5       2       0       0
6       2       9       0
7       3      15       0
8       4      11       .
但用:
  1. proc sort data=wJ_FCSY1_201205;by _col3;
  2. proc sort data=WJ_2011_FCSY1;by _col3;run;
  3. data test;
  4.         merge wJ_FCSY1_201205(in=left) WJ_2011_FCSY1(in=right);
  5.         by _col3;
  6.         if left=right then flag="1";else flag="0";
  7.         if left;
  8. proc print;run;
复制代码
结果用是:

Obs    _col3     b    _col12    flag
1       1      12      20       1
2       1      14      20       1
3       2       0      21       1
4       2       9       0       1
5       3      15       0       1
6       4      11       .       0

10
可~乐 发表于 2012-6-13 10:52:58
情迷仲夏夜 发表于 2012-6-13 00:04
merge的办法只对"一对一或一对多",但却不适合"多对多": 结果用proc sql 是:

Obs    _col3     ...
嗯,是的~~~

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-6 04:53