在“企业指南”中,我有一个表(称为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
中的每个观察,例如(UK
和GBP
),我想要将CTRY_UK
表与CRNCY_GBP
表一起加入,但我不知道在SAS
中这样做的方法。
换句话说,我想根据单独表格中给出的条目将两个表连接在一起。怎么办呢?
答案 0 :(得分:1)
您可以使用call open
和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
答案 1 :(得分:0)
这里最好的方法是从初始表创建代码,然后将其作为宏调用运行。
所以想象一下这个电话就像是
%macro join_my_Tables(country=,currency=);
create table &country. as
select whatever stuff from ctry_&country., crncy.¤cy.
...
;
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>