2017-08-09 58 views
0

我試圖用特定的方式組織一個數據集,其中包含一系列變化的變量。我遇到的問題是,我並不總是知道我將在數據集中使用的實際變量數量。我之前在變量列表是靜態的數據語句之後使用PROC SQL語句或RETAIN語句完成此操作。SAS/SQL動態訂購變量

我的數據是這樣的:

APPNUM DATE REASON1 REASON2 REASON3 REASON4 NAME1 NAME2 NAME3 NAME4 
123 1/1/2017 X  Y  Z  A  Jon Mary Tom Suzie 

我希望它看起來像這樣:

APPNUM DATE REASON1 NAME1 REASON2 NAME2 etc 
123 1/1/2017 X  Jon Y  Mary etc 

這會很容易與SQL或保留聲明。但是,我正在使用循環等將這些變量拉到一起,並且呈現的變量數量取決於我的輸入數據。有些日子裏可能有20個REASON/NAME實例,其他的可能有1個。

我嘗試了下面的代碼來拉取變量名稱列表,然後命令APPNUM,DATE,然後最後按變量名稱的最後一位進行排序。 I.E. 1,1,2,2,3,3 - 但我沒有成功。該列表被正確存儲 - 沒有錯誤,但是在解析VARLIST的值時。他們沒有按預期訂購。有沒有人試過並完成過這個?

PROC SQL; 
SELECT NAME INTO :VARLIST SEPARATED BY ',' 
FROM DICTIONARY.COLUMNS 
WHERE LIBNAME = 'WORK' 
AND MEMNAME = 'SFINAL' 
ORDER BY NAME, SUBSTR(NAME,LENGTH(NAME)-1); 
QUIT; 

上面的代碼會爲了這樣的事情:

APPNUM, DATE, NAME1...2...3..., REASON1...2...3... 

,而不是:

APPNUM, DATE, NAME1, REASON1, NAME2, REASON2.... 

回答

1

兩個問題。

首先,您在ORDER BY上的訂單已倒退。

其次,您的SUBSTR()調用不正確。最後你有一個任意長度的數字。你不知道會有多少個字符。最好的辦法是讀取該數字字符串,轉換爲數字,然後按順序排序。

data test; 
array name[20]; 
array reason[20]; 
format appnum best. date date9.; 
run; 

proc sql noprint; 
SELECT NAME INTO :VARLIST SEPARATED BY ',' 
FROM DICTIONARY.COLUMNS 
WHERE LIBNAME = 'WORK' 
AND MEMNAME = 'TEST' 
and (upcase(NAME) like 'NAME%' or upcase(NAME) like 'REASON%') 
ORDER BY input(compress(compress(name,'name'),'reason'),best.), NAME ; 
quit; 

%put &varlist; 

proc sql noprint; 
create table test2 as 
select APPNUM, DATE, &varlist 
from test; 
quit; 
+0

爲什麼ORDER BY向後?另外,我的SUBSTR沒有錯。你可以簡單地做一個長度 - N,SAS從那一點到這個字符串的其餘部分。 I.E. '數據測試; 長度$ 3; 輸入一個; datalines; abc ; 跑; proc sql; 創建表格新爲 select substr(a,length(a)-0)as a1 from test; quit; proc print data = new;運行;' 產生'c',但現在我解釋說,對於我自己,這仍然不支持1和2位數字 – DukeLuke

+1

您想要按數字和名稱排序。否則,首先將所有名稱分組,首先按照數字排序。嘗試上面的代碼,它會按照您的要求進行操作。 – DomPazz