基于一个变量的值条件组合多个数据集/表

时间:2015-11-20 19:23:07

标签: sql join merge sas

我已经看到了一些与我的问题有关的问题,但从来没有完全相同的结构,而且我对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 ...)中的任何线索都非常感谢!

取值

3 个答案:

答案 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;