При выборе данных из нескольких таблиц, имена которых сами содержат некоторые данные (в вашем случае состояние), вы можете сложить данные с помощью:
UNION ALL
в SQL
SET
в шаге данных
Пока вы собираете данные, вы также должны добавить новый столбец в выборку запроса, которая отслеживает состояние.
Рассмотрим этот шаблон для стека в SQL
data one;
do index = 1 to 10; do _n_ = 1 to 2; output; end; end;
run;
data two;
do index = 101 to 110; do _n_ = 1 to 2; output; end; end;
run;
proc sql;
create table want as
select
source, index
from
(select 'one' as source, * from one)
union all
(select 'two' as source, * from two)
;
Шаблон можно абстрагировать в шаблон для исходного кода SQL, который будет сгенерирован макросом.
%macro my_ultimate_selector (out=, inlib=, prefix= states=);
%local index n state;
%let n = %sysfunc(countw(&states));
proc sql;
create table &out as
select
state
, corp_ent_cd
, mkt_sgmt_admnstn_cd
, fincl_arngmt_cd
, aca_ind
, prod_type
, cvyr
, cvmo
, count(*) as state_7dim_level_cnt
from
%* ----- use the UNION ALL pattern for stacking data -----;
%do index = 1 %to &n;
%let state = %scan(&states, &index);
%if &index > 1 %then %str(UNION ALL);
(select "&state" as state, * from &inlib..&prefix.&state.)
%end;
group by 1,2,3,4,5,6,7,8 %* this seems to be to much grouping ?;
;
quit;
%mend;
%my_ultimate_selector (out=work.want, inlib=mdt, prefix=mbrship1_, states=ny il ar ak mi)
Если столбцы таблиц inlib не совпадают в отношении порядка и типа столбцов, используйте UNION ALL CORRESPONDING
, чтобы процедура SQL выстроила столбцы для вас.