将多年度多列合并的PROC SQL代码转换为SAS Data Step(含宏实现)
PROC SQL转SAS Data Step(宏实现)
需求说明
将原PROC SQL的多年度指标合并逻辑,转换为可支持6年数据、5-6列指标的SAS Data Step代码,通过宏实现批量处理,年度为预定义变量。
原逻辑回顾
原SQL通过多次UNION,对每个年度提取对应指标(做ROUND处理),过滤掉该年度所有指标均缺失的行,最终合并所有年度的结果。
宏实现代码
/* 预定义参数:年度变量名、年度显示值、指标列表 */ %let years = YEAR1 YEAR2 YEAR3 YEAR4 YEAR5 YEAR6; /* 对应&YEAR1至&YEAR6,需与IN_DATA中的列后缀匹配 */ %let year_values = 201819 201920 202021 202122 202223 202324; /* 每个年度的输出显示值 */ %let metrics = ANN_TURN ANN_PROF; /* 可扩展至5-6个指标,比如添加ANN_ASSET ANN_LIAB等 */ /* 定义转换宏 */ %macro transpose_multi_year(); data SASUSER.OUT_DATA; set WORK.IN_DATA; /* 循环处理每个年度 */ %do i = 1 %to %sysfunc(countw(&years)); %let curr_year_var = %scan(&years, &i); %let curr_year_val = %scan(&year_values, &i); /* 标记当前年度是否有非缺失指标 */ keep_row = 0; /* 提取并处理当前年度的所有指标 */ %do j = 1 %to %sysfunc(countw(&metrics)); %let curr_metric = %scan(&metrics, &j); /* 提取对应年度的指标列并做ROUND处理 */ &curr_metric = round(&curr_metric&&curr_year_var); /* 若指标非缺失,标记保留该行 */ if &curr_metric is not missing then keep_row = 1; %end; /* 若有至少一个非缺失指标,输出当前年度的记录 */ if keep_row then do; YEAR = &curr_year_val; output; end; %end; /* 保留最终输出的字段 */ keep YEAR ID &metrics; run; %mend transpose_multi_year(); /* 调用宏执行转换 */ %transpose_multi_year();
代码说明
- 参数配置:通过
&years、&year_values、&metrics三个宏变量批量配置年度和指标,无需重复修改核心代码 - 循环处理:外层循环遍历每个年度,内层循环处理该年度的所有指标
- 缺失值过滤:通过
keep_row标记判断当前年度是否有至少一个非缺失指标,仅输出符合条件的行 - 字段保留:最终仅保留输出所需的
YEAR、ID及处理后的指标列
示例输出
针对提供的IN_DATA示例,运行后SASUSER.OUT_DATA的结果为:
| ID | YEAR | ANN_TURN | ANN_PROF |
|---|---|---|---|
| 1 | 201819 | 100 | 10 |
| 1 | 201920 | 110 | 12 |
| 1 | 202021 | 120 | 15 |
扩展方式
- 新增年度:在
&years和&year_values中追加对应年度的变量名和显示值即可(最多支持6年) - 新增指标:在
&metrics中添加指标名称,宏会自动处理对应年度的指标列
内容的提问来源于stack exchange,提问作者supercoolphysicist
相关产品推荐
相关产品推荐

