根据观察结果在一个单独的表中(在EG中)加入两个表?

时间:2014-08-18 15:09:50

标签: join sas enterprise-guide

在“企业指南”中,我有一个表(称为COUNTRIES),其中包含一列中世界某些国家/地区的名称,以及第二列中该国家/地区的货币。

E.g。

CTRY | CRNCY
------------------------
UK     | GBP

US     | USD

FR     | EUR

AU     | AUD

此表仅是世界上所有国家/地区的一小部分,根据偏好,范围从10到20之间。此表中的条目数可以随时更改。

对于COUNTRIES中指定的每个国家/地区,我都有一个表格,其中包含有关该国家/地区的信息(例如,上面的示例,我有一个名为CTRY_UK, CTRY_US, CTRY_FR, CTRY_AU的表格等),其货币也是如此(所以我也有CRNCY_GBP, CRNCY_EUR等)

现在对于COUNTRIES中的每个观察,例如(UKGBP),我想要将CTRY_UK表与CRNCY_GBP表一起加入,但我不知道在SAS中这样做的方法。

换句话说,我想根据单独表格中给出的条目将两个表连接在一起。怎么办呢?

2 个答案:

答案 0 :(得分:1)

您可以使用call opencall set函数将数据值读入宏变量,然后使用宏变量编写您需要的任何代码。

%macro Combine;
    ** open Countries data in input mode;
    %let dsid = %sysfunc(open(Countries, i));
    ** set up reading of values into macro variables of the same name;
    %syscall set(dsid);
    ** read first observation;
    %let rc = %sysfunc(fetch(&dsid));

    %do %while (&rc = 0);
        ** merge data sets using the auto-filled &Cntry and &Crncy macro variables;
        data merged_&Cntry;
            merge CNTRY_&Cntry CRNCY_&Crncy;
            by ID;
        run;
        ** read next observation;
        %let rc = %sysfunc(fetch(&dsid));
    %end;
    ** close data set;
    %let rc = %sysfunc(close(&dsid));
%mend;

**  actual macro call;
%Combine

答案 1 :(得分:0)

这里最好的方法是从初始表创建代码,然后将其作为宏调用运行。

所以想象一下这个电话就像是

%macro join_my_Tables(country=,currency=);
 create table &country. as
   select whatever stuff from ctry_&country., crncy.&currency.
    ... 
    ;
 quit;
%mend join_my_Tables;

然后你会创建一个调用:

proc sql;
  select cats('%join_my_Tables(country=',ctry,',currency=',crncy,')')
    into :calllist separated by ' '
    from tbl1;
quit;

*not technically needing to be a separate proc sql here, just to show it is doing something else;
proc sql;
  &calllist. 
quit;

我怀疑,这会做你想要的。如果您的各种表格与它们有不同的方面,您可能需要对其进行一些修改(无论如何它们为什么分开;这是一种存储数据的愚蠢方式,除非列非常不同而您真的不想要由于某种原因的垂直结构。)

如果您有不同的列集,并且不想依赖select *,那么您可能需要创建一个存储此信息的数据集,并在宏执行期间将其拉出。 / p>