3

我坚持按日期过滤器动态创建表格。

在运行主要代码之前,我有用于设置日期过滤器的 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 个月内回顾性地运行大约 10 个主要代码。是否可以动态创建日期代码以便一次运行 12 个月的主要代码。

4

2 回答 2

3

您可以在以下代码的基础上构建

  • 第 1 步:创建dataset包含所有 12 个日期的日期。

不确定您如何计算所有 12 个月的日期,所以我假设dataset All_dates包含您所有带有变量的日期 - R_act_beg, R_act_end ,name_m,name_y_act,nameR_act。该数据集包含 12 条记录,每个月记录一条。

  • 步骤 2:一口气创建macro variables所有 12 个月


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;
  • 第三步:使用代码运行 12 次do loop and &&

%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;
于 2015-05-22T08:50:31.093 回答
2

我解决了@NEOmen 的答案的问题,但我想在“第 3 步”解决一个问题。“步骤 1”和“步骤 2”完全正确。“第 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;
于 2015-06-12T05:50:44.090 回答