Sas 我想创建一个宏来循环年、季、月和列值

Sas 我想创建一个宏来循环年、季、月和列值,sas,sas-macro,Sas,Sas Macro,SAS问题:我有一个表,有一列名为:Primary_coverage,有4个观察值,如下所示 基本医疗保险 组合单限 无保险驾驶人 医学的 身体伤害 我想创建一个宏来动态循环年、季、月和列值,这样我的表值应该如下所示:(2000Q1到2002Q4=36个月,12个季度,3年) 注:最早的一年总是从2000年第一季度开始 year quarter Primary_coverage months 2000 1 combined single limit 36 2000

SAS问题:我有一个表,有一列名为:Primary_coverage,有4个观察值,如下所示

基本医疗保险 组合单限 无保险驾驶人 医学的 身体伤害

我想创建一个宏来动态循环年、季、月和列值,这样我的表值应该如下所示:(2000Q1到2002Q4=36个月,12个季度,3年) 注:最早的一年总是从2000年第一季度开始

year quarter Primary_coverage months 2000 1 combined single limit 36 2000 2 combined single limit 33 2000 3 combined single limit 30 2000 4 combined single limit 27 2001 1 combined single limit 24 2001 2 combined single limit 21 2001 3 combined single limit 18 2001 4 combined single limit 15 2002 1 combined single limit 12 2002 2 combined single limit 9 2002 3 combined single limit 6 2002 4 combined single limit 3 2000 1 uninsured motorist 36 2000 2 uninsured motorist 33 2000 3 uninsured motorist 30 2000 4 uninsured motorist 27 2001 1 uninsured motorist 24 2001 2 uninsured motorist 21 2001 3 uninsured motorist 18 2001 4 uninsured motorist 15 2002 1 uninsured motorist 12 2002 2 uninsured motorist 9 2002 3 uninsured motorist 6 2002 4 uninsured motorist 3 2000 1 Medical 36 2000 2 Medical 33 2000 3 Medical 30 2000 4 Medical 27 2001 1 Medical 24 2001 2 Medical 21 2001 3 Medical 18 2001 4 Medical 15 2002 1 Medical 12 2002 2 Medical 9 2002 3 Medical 6 2002 4 Medical 3 2000 1 Bodily Injury 36 2000 2 Bodily Injury 33 2000 3 Bodily Injury 30 2000 4 Bodily Injury 27 2001 1 Bodily Injury 24 2001 2 Bodily Injury 21 2001 3 Bodily Injury 18 2001 4 Bodily Injury 15 2002 1 Bodily Injury 12 2002 2 Bodily Injury 9 2002 3 Bodily Injury 6 2002 4 Bodily Injury 3 年度季度主要医疗保险覆盖月数 2000 1合并单一限额36 2000 2合并单一限额33 2000 3合并单一限额30 2000 4合并单一限额27 2001年1合并单一限额24 2001年2合并单一限额21 2001年3合并单一限额18 2001年4合并单一限额15 2002年1合并单一限额12 2002年2合并单一限额9 2002年3合并单一限额6 2002年4合并单一限额3 2000 1无保险驾驶人36 2000 2无保险驾驶人33 2000 3无保险驾驶人30 2000 4无保险驾驶人27 2001 1无保险驾驶人24 2001年2未投保驾驶人21 2001年3月未投保驾驶人18 2001年4未投保的驾驶人15 2002年1未投保驾驶人12 2002年2未投保驾驶人9 2002年3未投保驾驶人6 2002年4未投保驾驶人3 2000年1月医疗36 2000 2医疗33 2000年3月30日 2000年4月27日 2001年1月24日 2001年2月21日 2001年3月18日 2001年4月15日 2002年1月12日 2002年2月9日 2002年3月6日 2002年4月3日 2000年1人身伤害36 2000年2人身伤害33 2000 3人身伤害30 2000年4人身伤害27 2001年1人身伤害24 2001年2人身伤害21 2001年3人身伤害18 2001年4人身伤害15 2002年1人身伤害12 2002年2人身伤害9 2002年3人身伤害6 2002年4人身伤害3 但当我在2003年第二季度运行相同的程序时,我的表应该如下所示:(2000年第一季度到2003年第二季度=42个月,14个季度,3年)

年度季度主要医疗保险覆盖月数 2000年1合并单一限额42 2000 2合并单一限额39 2000 3合并单一限额36 2000 4合并单一限额33 2001年1合并单一限额30 2001年2合并单一限额27 2001年3合并单一限额24 2001年4合并单一限额21 2002年1合并单一限额18 2002年2合并单一限额15 2002年3合并单一限额12 2002年4合并单一限额9 2003年1合并单一限额6 2003年2合并单一限额3 2000 1无保险驾驶人42 2000 2无保险驾驶人39 2000 3无保险驾驶人36 2000 4无保险驾驶人33 2001 1无保险驾驶人30 2001年2未投保驾驶人27 2001年3未投保驾驶人24 2001年4未投保驾驶人21 2002年1未投保驾驶人18 2002年2未投保驾驶人15 2002年3未投保驾驶人12 2002年4未投保驾驶人9 2003年1未投保驾驶人6 2003年2未投保驾驶人3 2000年1月医疗42 2000 2医疗服务39 2000年3月医疗36 2000年4月33日 2001年1月30日 2001年2月27日 2001年3月24日 2001年4月21日 2002年1月18日 2002年2月15日 2002年3月12日 2002年4月9日 2003年1月6日 2003年2医疗3 2000年1人身伤害42 2000年2人身伤害39 2000 3人身伤害36 2000年4人身伤害33 2001年1人身伤害30 2001年2人身伤害27 2001年3人身伤害24 2001年4人身伤害21 2002年1人身伤害18 2002年2人身伤害15 2002年3人身伤害12 2002年4人身伤害9 2003年1人身伤害6 2003年2人身伤害3
使用日期函数的组合来实现这一点。使用INTNX递增/递减日期,使用input()将YYYYQQ转换为SAS日期

Do循环非常简单

%let end_date = 2003Q2;

data date_list;
    format end_date date9. coverage $20.;
    end_date=input("&end_date", yyq6.);
    n_months=intck('month', '01Jan2000'd, end_date)+3;



    do coverage='Primary', 'Secondary', 'Tertiary';
    date=end_date;
        do months=n_months to 3 by -3;
            year=year(date);
            quarter=qtr(date);
            date=intnx('month', date, -3, 'b');
            output;
        end;
    end;
    Keep year quarter months coverage;
run;

我建议您编辑该问题,以便只显示所需的最低信息。该表中似乎有很多信息与您所问的内容无关,因此人们不太可能尝试破译这些信息。请参见此处关于创建最小、完整且可验证的示例:
%let end_date = 2003Q2;

data date_list;
    format end_date date9. coverage $20.;
    end_date=input("&end_date", yyq6.);
    n_months=intck('month', '01Jan2000'd, end_date)+3;



    do coverage='Primary', 'Secondary', 'Tertiary';
    date=end_date;
        do months=n_months to 3 by -3;
            year=year(date);
            quarter=qtr(date);
            date=intnx('month', date, -3, 'b');
            output;
        end;
    end;
    Keep year quarter months coverage;
run;