动态连接不同计数的表 SAS
dynamically joining tables of different counts SAS
我在 sas sql.
工作
我有一个脚本,它总是根据时间间隔生成不同数量的 tables。对于每天一个 table,列的名称是相同的,除了列余额。此列名称包含日期。 table 的名字是 TableName_date 就像 TableName_07092017 ... TableName_31092017
MT column RT AREA balance_07092017
ACCOUNTS balance_lcy 30 2004862772
ACCOUNTS balance_lcy 30 CA 121390255,8
ACCOUNTS balance_lcy 30 GL 323499587
ACCOUNTS balance_lcy 30 TF -7821721555
C_ACCOUNTS balance_lcy 35 CA 2,49733E+11
C_ACCOUNTS balance_lcy 35 NO 3748192715
MT column RT AREA balance_08092017
ACCOUNTS balance_lcy 30 -24278162321
ACCOUNTS balance_lcy 30 CA 225363070.05
ACCOUNTS balance_lcy 30 GL 3117815863.7
ACCOUNTS balance_lcy 30 TF 47914289803
C_ACCOUNTS balance_lcy 35 CA 37637391174
C_ACCOUNTS balance_lcy 35 NO 163722935.2
是否可以创建一个自动加入这些 table 的脚本?它们应该看起来像这样
MT column RT AREA balance_07092017 balance_08092017 balance_09092017 balance_10092017....
ACCOUNTS balance_lcy 30 2004862772 -24278162321
ACCOUNTS balance_lcy 30 CA 121390255,8 225363070.05
ACCOUNTS balance_lcy 30 GL 323499587 3117815863.7
ACCOUNTS balance_lcy 30 TF -7821721555 47914289803
C_ACCOUNTS balance_lcy 35 CA 2,49733E+11 37637391174
C_ACCOUNTS balance_lcy 35 NO 3748192715 163722935.2
这是创建我需要加入的 table 的代码
%macro sqlloop(start,end);
PROC SQL;
%DO DT_REP=&start. %TO &end.;
%let year=%sysfunc(year(&DT_REP.));
%let month=%sysfunc(month(&DT_REP.));
%let month1=%sysfunc(PUTN(&month.,z2.));
%let day=%sysfunc(day(&DT_REP.));
%let day1=%sysfunc(PUTN(&day.,z2.));
%let datum= &day1.&month1.&year.;
%put &datum.;
CREATE TABLE DUPLICITY_BAL_&datum. as
select 'ACCOUNTS' as MT, 'balance_lcy' as column, rec_type, area, sum(balance_lcy) as balance_lcy, count(balance_lcy) as count
from database.ACCOUNTS
where version_no = 1
and dt_rep = &DT_REP.
group by rec_type, area
union all
select 'C_ACCOUNTS' as MT, 'balance_lcy' as column, rec_type, area, sum(balance_lcy) as balance_lcy, count(balance_lcy) as count
from database.C_ACCOUNTS
where version_no = 1
and dt_rep = &DT_REP.
group by rec_type, area;
%END;
QUIT;
%mend;
%sqlloop(start=21070, end=21073)
首先不要这样做,以长格式保存您的数据。保持数据长,意味着您的 table 结构不会不断变化。您的报告结构可能会发生变化 - 但如果数据保持较长时间,从数据库的角度来看会更容易。宽幅也违反了'Tidy Data'.
的原则
追加 table 并将 balance_date 重命名为 balance,或者在所有数据集中使用相同的名称。
如果您想要报告的广泛形式,请使用 PROC REPORT。如果您真的、真的、真的(而且您不应该)想要以宽格式存储它,那么您可以在使用 ID and/or IDLABEL 的 PROC TRANSPOSE 之后转置它以创建相同的结构。
为什么要为此使用 SQL?使用 SAS 代码合并多个数据集非常简单。如果您想合并所有以 TableName_
开头的数据集,您可以使用 :
通配符来避免键入单个数据集名称。
data want ;
merge TableName_: ;
by MT column RT AREA ;
run;
为什么一开始要将数据拆分到多个表中?为什么不一次生成所有日期?
%macro sqlloop(start,end);
PROC SQL;
CREATE TABLE DUPLICITY_BAL as
select 'ACCOUNTS' as MT
, 'balance_lcy' as column
, dt_rep
, rec_type
, area
, sum(balance_lcy) as balance_lcy
, count(balance_lcy) as count
from database.ACCOUNTS
where version_no = 1
and dt_rep between &start and &end
group by 1,2,3,4,5
union all
select 'C_ACCOUNTS' as MT
, 'balance_lcy' as column
, dt_rep
, rec_type
, area
, sum(balance_lcy) as balance_lcy
, count(balance_lcy) as count
from database.C_ACCOUNTS
where version_no = 1
and dt_rep between &start and &end
group by 1,2,3,4,5
;
quit;
%mend sqlloop;
我在 sas sql.
工作我有一个脚本,它总是根据时间间隔生成不同数量的 tables。对于每天一个 table,列的名称是相同的,除了列余额。此列名称包含日期。 table 的名字是 TableName_date 就像 TableName_07092017 ... TableName_31092017
MT column RT AREA balance_07092017
ACCOUNTS balance_lcy 30 2004862772
ACCOUNTS balance_lcy 30 CA 121390255,8
ACCOUNTS balance_lcy 30 GL 323499587
ACCOUNTS balance_lcy 30 TF -7821721555
C_ACCOUNTS balance_lcy 35 CA 2,49733E+11
C_ACCOUNTS balance_lcy 35 NO 3748192715
MT column RT AREA balance_08092017
ACCOUNTS balance_lcy 30 -24278162321
ACCOUNTS balance_lcy 30 CA 225363070.05
ACCOUNTS balance_lcy 30 GL 3117815863.7
ACCOUNTS balance_lcy 30 TF 47914289803
C_ACCOUNTS balance_lcy 35 CA 37637391174
C_ACCOUNTS balance_lcy 35 NO 163722935.2
是否可以创建一个自动加入这些 table 的脚本?它们应该看起来像这样
MT column RT AREA balance_07092017 balance_08092017 balance_09092017 balance_10092017....
ACCOUNTS balance_lcy 30 2004862772 -24278162321
ACCOUNTS balance_lcy 30 CA 121390255,8 225363070.05
ACCOUNTS balance_lcy 30 GL 323499587 3117815863.7
ACCOUNTS balance_lcy 30 TF -7821721555 47914289803
C_ACCOUNTS balance_lcy 35 CA 2,49733E+11 37637391174
C_ACCOUNTS balance_lcy 35 NO 3748192715 163722935.2
这是创建我需要加入的 table 的代码
%macro sqlloop(start,end);
PROC SQL;
%DO DT_REP=&start. %TO &end.;
%let year=%sysfunc(year(&DT_REP.));
%let month=%sysfunc(month(&DT_REP.));
%let month1=%sysfunc(PUTN(&month.,z2.));
%let day=%sysfunc(day(&DT_REP.));
%let day1=%sysfunc(PUTN(&day.,z2.));
%let datum= &day1.&month1.&year.;
%put &datum.;
CREATE TABLE DUPLICITY_BAL_&datum. as
select 'ACCOUNTS' as MT, 'balance_lcy' as column, rec_type, area, sum(balance_lcy) as balance_lcy, count(balance_lcy) as count
from database.ACCOUNTS
where version_no = 1
and dt_rep = &DT_REP.
group by rec_type, area
union all
select 'C_ACCOUNTS' as MT, 'balance_lcy' as column, rec_type, area, sum(balance_lcy) as balance_lcy, count(balance_lcy) as count
from database.C_ACCOUNTS
where version_no = 1
and dt_rep = &DT_REP.
group by rec_type, area;
%END;
QUIT;
%mend;
%sqlloop(start=21070, end=21073)
首先不要这样做,以长格式保存您的数据。保持数据长,意味着您的 table 结构不会不断变化。您的报告结构可能会发生变化 - 但如果数据保持较长时间,从数据库的角度来看会更容易。宽幅也违反了'Tidy Data'.
的原则追加 table 并将 balance_date 重命名为 balance,或者在所有数据集中使用相同的名称。
如果您想要报告的广泛形式,请使用 PROC REPORT。如果您真的、真的、真的(而且您不应该)想要以宽格式存储它,那么您可以在使用 ID and/or IDLABEL 的 PROC TRANSPOSE 之后转置它以创建相同的结构。
为什么要为此使用 SQL?使用 SAS 代码合并多个数据集非常简单。如果您想合并所有以 TableName_
开头的数据集,您可以使用 :
通配符来避免键入单个数据集名称。
data want ;
merge TableName_: ;
by MT column RT AREA ;
run;
为什么一开始要将数据拆分到多个表中?为什么不一次生成所有日期?
%macro sqlloop(start,end);
PROC SQL;
CREATE TABLE DUPLICITY_BAL as
select 'ACCOUNTS' as MT
, 'balance_lcy' as column
, dt_rep
, rec_type
, area
, sum(balance_lcy) as balance_lcy
, count(balance_lcy) as count
from database.ACCOUNTS
where version_no = 1
and dt_rep between &start and &end
group by 1,2,3,4,5
union all
select 'C_ACCOUNTS' as MT
, 'balance_lcy' as column
, dt_rep
, rec_type
, area
, sum(balance_lcy) as balance_lcy
, count(balance_lcy) as count
from database.C_ACCOUNTS
where version_no = 1
and dt_rep between &start and &end
group by 1,2,3,4,5
;
quit;
%mend sqlloop;