3

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

例如

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

US     | USD

FR     | EUR

AU     | AUD

ETC

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

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

现在对于 中的每个观察COUNTRIES,例如 (UKGBP),我想将CTRY_UK表格与CRNCY_GBP表格连接起来,但我不知道在SAS.

换句话说,我想根据单独表中给出的条目将两个表连接在一起。如何才能做到这一点?

4

2 回答 2

1

call open您可以使用and函数将数据值读入宏变量call 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
于 2014-08-18T17:23:23.607 回答
0

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

所以想象一下这个电话是这样的

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

然后你会创建调用ot:

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 *,那么您可能需要创建一个数据集来存储此信息并在宏执行期间将其拉出。

于 2014-08-18T17:15:45.213 回答