我已经看到了一些与我的问题有关的问题,但从来没有完全相同的结构,而且我对SAS / SQL很新,我无法找到解决问题的正确方法。
我正在尝试连接多个表(大约30个)
基本上,我的问题归结为:
假设我有3张桌子:
TAB,有2个变量V1和V2 t1,有2个变量V2和V3 t2,具有相同的2个变量V2和V3
我想用T1或t2加入TAB,具体取决于V2的值,以获得Full_TABLE
TAB
V1 V2
A 1
B 1
C 2
D 2
t1
V2 V3
1 x
1 y
1 z
t2
V2 V3
2 h
2 i
2 j
预期结果:
Full_TABLE
V1 V2 V3
A 1 x
A 1 y
A 1 z
B 1 x
B 1 y
B 1 z
C 2 h
C 2 i
C 2 j
D 2 h
D 2 i
D 2 j
逻辑上,它是基于V2的值的条件连接:
如果V2 = 1,则将TAB与t1
如果V2 = 2,则将TAB与t2
我不知道是否可以自动执行此操作,
为了给出一个粗略的想法,V1有30.000个不同的值,V2有27个(所以27个表t1-t27),V3每个值有2个值,因此我期望Full_TABLE为30.000 * 10 = 300.000行
所以我可以管理基于V2和/或V3的半自动化解决方案,但不能管理V1
SAS或SQL(或proc sql ...)中的任何线索都非常感谢!
取值
答案 0 :(得分:3)
您可以使用proc sql
和一些SQL聪明:
proc sql;
select tab.v1, tab.v2, coalesce(t1.v3, t2.v3) as v3
from tab left join
t1
on tab.v2 = 1 left join
t2
on tab.v2 = 2;
答案 1 :(得分:1)
数据步骤解决方案很有意思:
data want;
set tab;
if v2=1 then do;
do _n_ = 1 to nobs_t1;
set t1 point=_n_ nobs=nobs_t1;
output;
end;
end;
else if v2=2 then do;
do _n_=1 to nobs_t2;
set t2 point=_n_ nobs=nobs_t2;
output;
end;
end;
run;
标准"笛卡尔加入数据步骤",只做了两次,并告诉SAS要做什么。
基本上,您使用point
来迭代t1或t2,具体取决于v2的值。如果需要允许许多表/变量值(类似于扩展sql解决方案的方式),可以通过宏语言扩展这一点。
答案 2 :(得分:0)
在我看来,T1和T2是基于V2值分成两个的同一个表。为什么不只是UNION他们然后加入?
proc sql ;
create table want as
select a.*,b.v3
from tab a
, (select * from t1 union select * from t2) b
where a.v2 = b.v2
;
quit;