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;
我正在 运行宁代码,几乎是自动的。我只需要替换一个值,运行。但是有一部分我必须做 '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;