2017-05-10 88 views
-1

我有一個輸出表,其中包含來自30個不同表格的300多個變量,這些表格由UNION連接,用於建模。我創建了一個宏,它使用這個輸出表創建一個包含許多統計數據的報告,例如平均值,最小值/最大值等。我試圖在報告中添加一列,詳細說明變量來自哪個表。我說表中的一些變量是在不同的表中共享的。我希望避免在報告中多次使用相同的變量,因爲統計數據是相同的,無論變量來自哪個表。有沒有一種有效的方法來做到這一點?SAS-在報告中添加原始表名稱作爲列

+0

您可能需要更具體才能在此處獲得答案。如果您想知道OBSERVATION來自哪個數據集,則使用數據步驟合併記錄,並在SET語句中使用INDSNAME =選項。無論如何,使用SET語句的數據步驟可能比使用帶有UNION的SQL更好。 – Tom

+0

請提供一些示例數據,顯示您正在嘗試做什麼。 – Joe

回答

0

如果是我,我會遍歷union數據集中的每一個,並將表名稱和變量名稱放入已編譯的數據集中。您可能在宏列表中或者輸入了所有表名,因此您只需添加幾行代碼即可在每個表上運行proc contents以編譯完整的表和變量名稱列表。需要注意的是喜歡你的例子,會有表編譯後,您可以修改重複的變量名:不是UNION的

** 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.); 
0

考慮使用數據步驟,然後使用INDSNAME選項,而不是。

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

我能夠做到這一點使用如下:

與源表中創建表。

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;