41%macro irmst_aggregate_from_rules(ds_in_src_tbl =
42 , ds_in_agg_rules_config =
43 , out_ds = WORK.RESULT
48 length src_where_vars_all src_col_all aggregation_rule_all _tmp_agg_stmt $ 2000 _tmp_src_where_var _tmp_src_agg_var $ 32;
50 set &ds_in_agg_rules_config. end=eof;
52 do i = 1 to countw(SRC_WHERE_VARS);
53 _tmp_src_where_var = scan(SRC_WHERE_VARS, i);
54 if findw(src_where_vars_all, _tmp_src_where_var,
' ',
'R') = 0 then src_where_vars_all = catx(
' ', src_where_vars_all, _tmp_src_where_var);
57 _tmp_src_agg_var = upcase(SRC_COL);
58 if findw(src_col_all, _tmp_src_agg_var,
' ',
'R') = 0 then src_col_all = catx(
' ', src_col_all, _tmp_src_agg_var);
60 _tmp_agg_stmt = cats(upcase(AGGREGATION_RULE),
'(', upcase(SRC_COL),
')=', upcase(SRC_COL),
'_', upcase(AGGREGATION_RULE));
61 if findw(aggregation_rule_all, _tmp_agg_stmt,
' ',
'R') = 0 then aggregation_rule_all = catx(
' ', aggregation_rule_all, _tmp_agg_stmt);
63 call symputx(
"src_where_vars", src_where_vars_all,
"L");
64 call symputx(
"src_agg_vars", src_col_all,
"L");
65 call symputx(
"agg_type_out_stmt", aggregation_rule_all,
"L");
69 proc hpsummary data=&ds_in_src_tbl.;
70 classes &src_where_vars.;
72 output out=_tmp_agg (drop=_TYPE_ _FREQ_) &agg_type_out_stmt.;
76 data &out_ds.(keep=SRC_COL AGGREGATION_RULE AGG_VALUE &src_where_vars.);
77 length SRC_COL AGGREGATION_RULE $ 32. AGG_VALUE 8.;
80 array num{*} _NUMERIC_;
82 if vname(num[i]) ne
'AGG_VALUE' then
do;
83 do j = 1 to (countc(vname(num[i]),
'_') + 1);
84 if j < (countc(vname(num[i]),
'_') + 1) then SRC_COL = catx(
'_', SRC_COL, scan(vname(num[i]), j,
'_'));
85 AGGREGATION_RULE = scan(vname(num[i]), j,
'_');