SAS:如何获得不同数量的数据集的联合?

SAS: How to get the union of a different number of datasets?

我正在 运行宁代码,几乎是自动的。我只需要替换一个值,运行。但是有一部分我必须做 'by hand'。

就是下面的代码:

PROC SQL; 
   CREATE TABLE DDATA.SUS_151_ALL AS 
   SELECT * FROM (SELECT * FROM DDATA.RFN_ID673 
                   UNION
                  SELECT * FROM DDATA.RPFN_ID472 
                   UNION
                  SELECT * FROM DDATA.RPFN_ID553);
 QUIT;

在这种情况下,我要获得联盟的客户在这里:

PROC SQL NOPRINT;
   SELECT EN FROM DDATA.E5P_151; 
   SELECT COUNT(*) FROM DDATA.E5P_151;
QUIT;

这里,我得到如下结果:

673
472
553 
---page break--
3

所以,我想要一些可以自动读取我想要获得联合并创建 table DDATA.SUS_151_ALL 的 3 个数据集的东西。

我有其他客户,我有 8 个 id 需要加入,必须手动完成 100 次需要我一些时间。我只想替换源代码 151。

例如,对于另一个客户,假设 id=1000 像这样:

3
7
9
12
16
77
991
1028

我想要一个程序 运行 这个:

PROC SQL; 
   CREATE TABLE DDATA.SUS_1000_ALL AS 
   SELECT * FROM (SELECT * FROM DDATA.RFN_ID3
                   UNION
                  SELECT * FROM DDATA.RPFN_ID7 
                   UNION
                  SELECT * FROM DDATA.RPFN_ID9
                   UNION
                  SELECT * FROM DDATA.RPFN_ID12
                   UNION
                  SELECT * FROM DDATA.RPFN_ID16
                   UNION
                  SELECT * FROM DDATA.RPFN_ID77
                   UNION
                  SELECT * FROM DDATA.RPFN_ID991
                   UNION
                  SELECT * FROM DDATA.RPFN_ID1028);
QUIT;

这可能吗?你能给我一些提示吗?

您可以使用宏来构建 sql 代码,然后在 proc sql 中执行它。下面是代码。希望对你有帮助。

proc sql;
    select EN into :value1 - :value&SysMaxLong from DDATA.E5P_151;
    select count(*) into :cnt from DDATA.E5P_151;
quit;

%global newtext;
%let newtext=;

%macro sqlstmt;

    %do i = 1 %to &cnt;

        %if(&i=&cnt) %then %do;
            %let newtext=&newtext. select * from DDATA.RFN_ID&&value&i ;
        %end;
        %else %do;
            %let newtext=&newtext. select * from DDATA.RFN_ID&&value&i union;
        %end;

        %put newtext=&newtext;
    %end;

%mend sqlstmt;

%sqlstmt

现在在procsql语句中加入这个新的宏变量&newtext并执行

proc sql;
    create table NEW as (&newtext);
quit;

我不会使用 SQL 来连接这样的数据集。只需使用一个数据步骤。

data all ;
  set rpfn_id: ;
run;

如果您只想让其中一些说 3,7 和 9,那么您可以使用一些宏代码来生成数据集名称列表。

%let list=3 7 9;
%let dslist=rpfn_id%sysfunc(tranwrd(%sysfunc(compbl(&list)),%str( ),%str( rpfn_id)));
data all ;
  set %unquote(&dslist);
run;