Создайте таблицу со значениями имени столбца, доступными в другой таблице - PullRequest
0 голосов
/ 05 февраля 2019

SAS Datastep - Создайте таблицу динамически со значениями имени столбца, доступными в другой таблице.

Пример: мой Source_Table будет выглядеть как | Поле № | Имя поля || 1 ||| 3 |B || 2 |C |

/*Dynamic table creation*/
%let  s1=;
/*Column lenght should be 30 characters so I am creating a dummy variable*/
%let Dummy= 'Dummy_Dummy_Dummy_Dummy_Dummy_Dummy_Dummy';

proc sql;
    create table TEMP as 
        select 'Hi' as Work from Temp_table where 1=2
    ;
quit;

proc sort data =   Source_table
    by Field_No;
run;

proc sql;
    select Dummy||" as "||fld into :s1 seperated by "," from
    (select "&Dummy" as Dummy,substr(strip(upcase(field_name)),1,30)) as FLD 
from Source_table)
    ;
quit;

proc sql;
    create table target_table  as 
        select "&Dummy." as value_1,&s1 from TEMP where 1=2;
quit;

Таблица назначения должна быть | A | B | C |

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Спасибо, Крис.

Я попробовал что-то подобное, и это сработало

proc sql noprint;
select catt(Field_name, ' char(30)') into :Col_name separated by ', '
from Source_table
order by field_no;

create table Target_table
(Value_1 char(30), &Col_name);
quit;
0 голосов
/ 05 февраля 2019

Не совсем понятно, о чем вы спрашиваете;Вы конкретно упоминаете использование шага данных SAS, но тогда в вашем примере кода используется PROC SQL - имеет ли значение, какой из них используется?Также обратите внимание, что ваш ввод имеет | Поле № | Имя поля | 1 | A | 3 | B | 2 | C |но затем вы говорите, что вывод должен быть в порядке ABC - должны ли поля быть в порядке, указанном в Field_No, или нет?

В любом случае, вот очень простой код, который работает:

    * Create the input data set;
    data source_table;
      field_no = 1; field_name = 'A'; output;
      field_no = 3; field_name = 'B'; output;
      field_no = 2; field_name = 'C'; output;
    run;

    * Derive the list of field/variable names, in the correct order;
    proc sql noprint;
      select field_name into :var_list separated by ' '
        from source_table
        order by field_no
      ;
    quit;

    * Create the output data set using the variable list created above;
    data target_table;
      length &var_list $ 30;
    run;

Если есть дополнительные требования, которые означают, что этот простой подход не разрешен, пожалуйста, обновите вопрос, чтобы объяснить, почему нет.Этот код создает все указанные столбцы как символьные переменные длиной 30, но его можно легко расширить, чтобы тип, длина и метка для каждой переменной также указывались в source_table - такого рода действия выполняются все время вмоя работа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...