SAS-将原始表名称作为列添加到报告中

SAS-将原始表名称作为列添加到报告中,sas,report,Sas,Report,我有一个输出表,其中包含30个不同表中的300多个变量,这些表由UNION连接,用于建模。我创建了一个宏,该宏使用此输出表创建了一个包含大量统计信息的报告,例如平均值、最小值/最大值等。我试图在报告中添加一列,详细说明变量来自哪个表。我说表是因为一些变量在不同的表中共享。我希望避免在报告中多次使用相同的变量,因为无论变量来自哪个表,统计数据都是相同的。有没有一种有效的方法可以做到这一点?如果是我,我会循环遍历每个union数据集,然后将表名和变量名放入编译后的数据集中。您可能在宏列表中或键入了所

我有一个输出表,其中包含30个不同表中的300多个变量,这些表由UNION连接,用于建模。我创建了一个宏,该宏使用此输出表创建了一个包含大量统计信息的报告,例如平均值、最小值/最大值等。我试图在报告中添加一列,详细说明变量来自哪个表。我说表是因为一些变量在不同的表中共享。我希望避免在报告中多次使用相同的变量,因为无论变量来自哪个表,统计数据都是相同的。有没有一种有效的方法可以做到这一点?

如果是我,我会循环遍历每个
union
数据集,然后将表名和变量名放入编译后的数据集中。您可能在宏列表中或键入了所有表名,因此您只需再添加几行代码,在每行上运行
proc contents
,即可编译表名和变量名的完整列表。请注意,与您的示例一样,在编译表后,您可以修改重复的变量名:

** create different tables **;
data height; set sashelp.class(keep=name height); run;
data weight; set sashelp.class(keep=name weight); run;
data sex; set sashelp.class(keep=name sex); run;

** put your datasets into a list either manually or dynamically **;
/* manually */
%let ds_list=height weight sex; 

/* dynamically -- be careful to include only tables in your union */
proc sql noprint;
    select MEMNAME
    into: ds_list separated by " "
    from sashelp.vmember
    where libname = "WORK" and memname not in ("SASMACR","FORMATS");
quit;

%put &ds_list.;

** loop over each table to put the table name and variables in a dataset **;
%MACRO get_names(ds_list);
%do i=1 %to %sysfunc(countw(&ds_list.));
    %let ds = %scan(&ds_list.,&i.);
    proc contents data = &ds. noprint 
        out=names_&ds.(keep=MEMNAME NAME rename=(MEMNAME=SOURCE_DATASET));
    run;

    proc append data = names_&ds. base=full force; run;
%end;
%MEND;

%get_names(&ds_list.);

而不是联合考虑使用一个数据步骤,然后使用<代码> IdSnord< /Cord>选项。

data want;
set sashelp.class sashelp.cars indsname=source;
source_dataset = source;
run;

我通过以下方法成功地做到了这一点:

使用源表创建表

PROC SQL;
CREATE TABLE    SOURCES AS
SELECT          NAME
                ,MEMNAME
FROM            DICTIONARY.COLUMNS
WHERE           LIBNAME='LIBNAME'
ORDER BY 1,2;
RUN;
加入我的统计表

PROC SQL;
CREATE TABLE    STATS_NEW AS
SELECT          memname AS TABLE_NAME,a.*
FROM            STATS a
LEFT JOIN       SOURCES b
ON              a.name = b.name
GROUP BY        a.name
ORDER BY        a.name;
QUIT;
转置数据并添加逗号分隔符

DATA            STATS_TRANSPOSE (drop=TABLE_NAME);
LENGTH          INPUT_TABLES $1000;
SET             STATS_NEW;
BY              name;

RETAIN          INPUT_TABLES;
IF              FIRST.name THEN DO; INPUT_TABLES=TABLE_NAME; END;

IF NOT          FIRST.name
THEN DO;
            INPUT_TABLES=CATS(INPUT_TABLES,', ',TABLE_NAME);
END;
IF              LAST.name THEN DO;
IF              name IN ('FIELD1','FIELD2')
THEN DO;        INPUT_TABLES='ALL'; END;
OUTPUT;
END;
RUN;

你可能需要更具体一些才能得到答案。如果您想知道观察来自哪个数据集,请使用数据步骤组合记录,并在SET语句上使用INDSNAME=选项。使用SET语句的数据步骤可能比使用SQL和UNION更好。请提供一些示例数据,说明您正在尝试执行的操作。