SAS:一次性为不同的日期和 table 名称动态创建表
SAS: Creating Tables Dynamically for different dates and table names in one go
我坚持通过日期过滤器动态创建表。
我在 运行ning 主代码之前有用于设置日期过滤器的 SAS 代码。
这是日期代码;
data _null_;
/*ACTUAL DATES*/
R_act_beg=intnx('month',today(),-12,'beginning');
call symput('R_act_beg',R_act_beg);
R_act_end=intnx('month',today(),-1,'end');
call symput('R_act_end',R_act_end);
name_m=put(month(intnx('month',today(),-1)),z2.);
call symput('name_m',name_m);
name_y_act=put(year(intnx('month',today(),-1)),z4.);
call symput('name_y_act',name_y_act);
nameR_act=name_m||substr(name_y_act,3,4);
call symput('nameR_act',nameR_act);
这是主要代码之一;
PROC SQL;
CREATE TABLE DATA.PREMIUM&nameR_act AS
SELECT t1.POLICY_NO,
/* SUM_of_PREMIUM */
(SUM(t1.PREMIUM)) FORMAT=22.2 AS SUM_of_PREMIUM
FROM WH.V_PRODUCT t1
WHERE t1.ISSUE_DATE BETWEEN &R_act_beg AND &R_act_end AND t1.PRODUCT_NO IN
(
'421',
'423',
'424',
'425',
'404',
'433',
'430',
'444',
'441',
'443',
'453'
)
GROUP BY t1.POLICY_NO;
QUIT;
所以我应该运行回顾12个月左右的十个主要代码。是否可以动态创建一个日期代码,以便 运行一次性将主要代码设置为 12 个月。
您可以在以下代码的基础上构建
- 第一步
: 创建包含所有 12 个日期的
dataset
。
不确定您是如何计算所有 12 个月的日期的,
所以我假设 dataset All_dates
包含你所有的日期
带有变量 - R_act_beg, R_act_end ,name_m,name_y_act,nameR_act
。
该数据集包含 12 条记录,每个月一条。
第 2 步:一次性创建所有 12 个月的 macro variables
proc sql;
select R_act_beg into: R_act_beg1 - :R_act_beg12 from all_dates;
select R_act_end into: R_act_end1 - :R_act_end12 from all_dates;
select name_m into: name_m1 - :name_m12 from all_dates;
select name_y_act into: name_y_act1 - :name_y_act12 from all_dates;
select nameR_act into: nameR_act1 - :nameR_act12 from all_dates;
quit;
- Step3: 运行 使用
do loop and &&
代码 12 次
%macro run_12_times;
%do i=1 %to 12;
PROC SQL;
CREATE TABLE DATA.PREMIUM&nameR_act&&i. AS
SELECT t1.POLICY_NO,
/* SUM_of_PREMIUM */
(SUM(t1.PREMIUM)) FORMAT=22.2 AS SUM_of_PREMIUM
FROM WH.V_PRODUCT t1
WHERE t1.ISSUE_DATE BETWEEN &R_act_beg&&i. AND &R_act_end&&i. AND t1.PRODUCT_NO IN
(
'421',
'423',
'424',
'425',
'404',
'433',
'430',
'444',
'441',
'443',
'453'
)
GROUP BY t1.POLICY_NO;
%end;
%mend;
%run_12_times;
我解决了@NEOmen 的回答问题,但我想修复 "Step 3" 处的一个错误。
"Step 1" 和 "Step 2" 完全正确。 "Step 3"应该是这样的。
再次感谢。
%macro run_12_times;
%do i=1 %to 12;
PROC SQL;
CREATE TABLE DATA.PREMIUM&&nameR_act&i. AS
SELECT t1.POLICY_NO,
/* SUM_of_PREMIUM */
(SUM(t1.PREMIUM)) FORMAT=22.2 AS SUM_of_PREMIUM
FROM WH.V_PRODUCT t1
WHERE t1.ISSUE_DATE BETWEEN "&&R_act_beg&i."d AND "&&R_act_end&i."d AND t1.PRODUCT_NO IN
(
'421',
'423',
'424',
'425',
'404',
'433',
'430',
'444',
'441',
'443',
'453'
)
GROUP BY t1.POLICY_NO;
%end;
%mend;
%run_12_times;
我坚持通过日期过滤器动态创建表。
我在 运行ning 主代码之前有用于设置日期过滤器的 SAS 代码。
这是日期代码;
data _null_;
/*ACTUAL DATES*/
R_act_beg=intnx('month',today(),-12,'beginning');
call symput('R_act_beg',R_act_beg);
R_act_end=intnx('month',today(),-1,'end');
call symput('R_act_end',R_act_end);
name_m=put(month(intnx('month',today(),-1)),z2.);
call symput('name_m',name_m);
name_y_act=put(year(intnx('month',today(),-1)),z4.);
call symput('name_y_act',name_y_act);
nameR_act=name_m||substr(name_y_act,3,4);
call symput('nameR_act',nameR_act);
这是主要代码之一;
PROC SQL;
CREATE TABLE DATA.PREMIUM&nameR_act AS
SELECT t1.POLICY_NO,
/* SUM_of_PREMIUM */
(SUM(t1.PREMIUM)) FORMAT=22.2 AS SUM_of_PREMIUM
FROM WH.V_PRODUCT t1
WHERE t1.ISSUE_DATE BETWEEN &R_act_beg AND &R_act_end AND t1.PRODUCT_NO IN
(
'421',
'423',
'424',
'425',
'404',
'433',
'430',
'444',
'441',
'443',
'453'
)
GROUP BY t1.POLICY_NO;
QUIT;
所以我应该运行回顾12个月左右的十个主要代码。是否可以动态创建一个日期代码,以便 运行一次性将主要代码设置为 12 个月。
您可以在以下代码的基础上构建
- 第一步
: 创建包含所有 12 个日期的
dataset
。
不确定您是如何计算所有 12 个月的日期的,
所以我假设 dataset All_dates
包含你所有的日期
带有变量 - R_act_beg, R_act_end ,name_m,name_y_act,nameR_act
。
该数据集包含 12 条记录,每个月一条。
第 2 步:一次性创建所有 12 个月的
macro variables
proc sql;
select R_act_beg into: R_act_beg1 - :R_act_beg12 from all_dates;
select R_act_end into: R_act_end1 - :R_act_end12 from all_dates;
select name_m into: name_m1 - :name_m12 from all_dates;
select name_y_act into: name_y_act1 - :name_y_act12 from all_dates;
select nameR_act into: nameR_act1 - :nameR_act12 from all_dates;
quit;
- Step3: 运行 使用
do loop and &&
代码 12 次
%macro run_12_times;
%do i=1 %to 12;
PROC SQL;
CREATE TABLE DATA.PREMIUM&nameR_act&&i. AS
SELECT t1.POLICY_NO,
/* SUM_of_PREMIUM */
(SUM(t1.PREMIUM)) FORMAT=22.2 AS SUM_of_PREMIUM
FROM WH.V_PRODUCT t1
WHERE t1.ISSUE_DATE BETWEEN &R_act_beg&&i. AND &R_act_end&&i. AND t1.PRODUCT_NO IN
(
'421',
'423',
'424',
'425',
'404',
'433',
'430',
'444',
'441',
'443',
'453'
)
GROUP BY t1.POLICY_NO;
%end;
%mend;
%run_12_times;
我解决了@NEOmen 的回答问题,但我想修复 "Step 3" 处的一个错误。 "Step 1" 和 "Step 2" 完全正确。 "Step 3"应该是这样的。 再次感谢。
%macro run_12_times;
%do i=1 %to 12;
PROC SQL;
CREATE TABLE DATA.PREMIUM&&nameR_act&i. AS
SELECT t1.POLICY_NO,
/* SUM_of_PREMIUM */
(SUM(t1.PREMIUM)) FORMAT=22.2 AS SUM_of_PREMIUM
FROM WH.V_PRODUCT t1
WHERE t1.ISSUE_DATE BETWEEN "&&R_act_beg&i."d AND "&&R_act_end&i."d AND t1.PRODUCT_NO IN
(
'421',
'423',
'424',
'425',
'404',
'433',
'430',
'444',
'441',
'443',
'453'
)
GROUP BY t1.POLICY_NO;
%end;
%mend;
%run_12_times;