请选择 进入手机版 | 继续访问电脑版
楼主: priss111
2608 4

请问sql通过关键变量连接2个表时,如何只保留表2中的部分变量?谢谢! [推广有奖]

  • 0关注
  • 5粉丝

副教授

15%

还不是VIP/贵宾

-

威望
0
论坛币
153 个
通用积分
47.5396
学术水平
11 点
热心指数
14 点
信用等级
10 点
经验
14938 点
帖子
473
精华
0
在线时间
805 小时
注册时间
2008-3-30
最后登录
2024-4-12

priss111 发表于 2016-12-13 17:10:40 |显示全部楼层 |坛友微信交流群

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
各位老师好,
请问sql通过关键变量连接2个表时,
如何只保留表2中的部分变量?
谢谢!

例如:
表1中有50个变量,其中关键变量是id;
表2中有30个变量,其中关键变量也是id;
如何用sql将表2中的部分变量(其中8个)通过id匹配到表1中?

proc sql;
    create table card_ as
    select *
    from card1 as one
    join card2(input(comperss(var1,"‘’"),$40.) as id
                            where var27 is not missing)
...

quit;

二维码

扫码加我 拉你入群

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

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

关键词:关键变量 sql proc sql missing Select

回帖推荐

分析哥 发表于2楼  查看完整内容

proc sql; create table card_ as select a.*,b.var1,b.var2```b.var8 from card1 as a inner join card2 as b on (input(comperss(a.var1,"‘’"),$40.) as a.id =(input(comperss(b.var1,"‘’"),$40.) as b.id where a.var27 is not missing ... quit; input(comperss(a.var1,"‘’")这一段我没这么干过,如果报错可以提前先分别处理好再直接a.id=b.id inner join 适用于只保存两个表共有obs的情 ...
分析哥 发表于 2016-12-14 02:01:36 |显示全部楼层 |坛友微信交流群
proc sql;
    create table card_ as
    select a.*,b.var1,b.var2```b.var8
    from card1 as a
    inner join card2 as b
on (input(comperss(a.var1,"‘’"),$40.) as a.id
=(input(comperss(b.var1,"‘’"),$40.) as b.id
where a.var27 is not missing
...

quit;
input(comperss(a.var1,"‘’")这一段我没这么干过,如果报错可以提前先分别处理好再直接a.id=b.id
inner join 适用于只保存两个表共有obs的情况,要保留左边或右边表全部记录就改成left join or right join

使用道具

priss111 发表于 2016-12-14 09:11:46 |显示全部楼层 |坛友微信交流群
分析哥 发表于 2016-12-14 02:01
proc sql;
    create table card_ as
    select a.*,b.var1,b.var2```b.var8
好。
谢谢分析哥通宵达旦的给出指教。


input这段如果加as a.id/b.id确实会报错,
不加就不会报错,
但不知这样是否规范?
有哪位老师回答一下。

***这段运行正常;
把where直接放在card2后面(本来where 就是对card2进行筛选的) 匹配的数据才是真正想要的数据;
如果先配对再where话得到的是另一个目标的数据集;
where究竟放在哪个位置依据目的而定;

proc sql;
    create table card_ as
    select a.*,
            b.var1,
            b.var53,
            b.var54,
            b.var57,
            b.var58,
            b.var59,
            b.var60,
            b.var61
    from card1 as a
    left join card2 as b
    on input(compress(a.card_id,"‘’"),$40.) = (input(compress(b.var1,"‘’"),$40.))
    where b.var27 is not missing
    ;
quit;

proc sql;
        create table card_ as
        select a.*,
                        b.var1,
                        b.var53,
                        b.var54,
                        b.var57,
                        b.var58,
                        b.var59,
                        b.var60,
                        b.var61
        from card1 as a
        left join card2(where=(var27 is not missing)) as b
        on input(compress(a.card_id,"‘’"),$40.) = (input(compress(b.var1,"‘’"),$40.))
        ;
quit;

使用道具

分析哥 发表于 2016-12-15 04:04:52 |显示全部楼层 |坛友微信交流群
priss111 发表于 2016-12-14 09:11
好。
谢谢分析哥通宵达旦的给出指教。
不客气,时差党表示用不着通宵达旦···where a 那个我随便写的,你想筛选B很容易改。不加as a.id的话,运行没有问题,只是变量名有时候会比较奇怪,虽然我不建议这么改,因为这些步骤完全可以提前完成,在一个query里面加太多function会让程序容易犯错,而且不太好理解。我建议在没有把握的情况下,不妨慢一点,一步一步的处理。

使用道具

priss111 发表于 2016-12-15 08:57:35 |显示全部楼层 |坛友微信交流群
分析哥 发表于 2016-12-15 04:04
不客气,时差党表示用不着通宵达旦···where a 那个我随便写的,你想筛选B很容易改。不加as a.id的话, ...
恩。
听你的。
在不报错的情况下按照规范来。

使用道具

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

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

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

GMT+8, 2024-4-16 23:45