2014-03-06 201 views
0

我有一個問題,可能很簡單,但我不知道。sas宏在proc sql

我有專欄name1 c1 c2 c3 c4 .... c8我必須按這些列的名稱進行求和並創建一個新數據。

這是我寫的代碼,但它沒有奏效。

你能幫我嗎?

PROC SQL; 
    CREATE TABLE WORK.data1 AS 
    SELECT t1.name1, 

%let k=8 
%macro test; 
%do i=0 %to &k; 
%sysfunc(SUM(C&i)) AS C&i; 
%END; 
%mend test; 
%test; 
     FROM WORK.data t1 
     GROUP BY t1.name1, 
QUIT; 
+0

也許看看本文:http://www2.sas.com/proceedings/sugi29/243-29.pdf –

+0

好,我會研究這一點。非常感謝你 – user3375397

+0

沒問題:)提示:%let和sysfunc在這一點使用後沒有必要使用分號。 你可以使用mprint和mfile結合得到一個包含由宏代碼生成的基本代碼的文件。對調試和學習非常有用。 –

回答

3
data data; 
input name1 $ c1 c2 c3; 
datalines4; 
a 1 2 3 
a 1 2 3 
b 1 2 3 
b 1 2 3 
;;;; 
run; 

%macro test(k=); 
    PROC SQL; 
    CREATE TABLE WORK.data1 AS 
    SELECT t1.name1 

%do i=1 %to &k.; 
    , SUM(C&i.) AS C&i. 
%END; 

    FROM WORK.data t1 
    GROUP BY t1.name1; 
QUIT; 

%mend test; 
%test(k=3); 
+0

麥克謝謝你,我會試試這個,並搜索我做錯了什麼。 – user3375397

+0

親切完成!非常感謝你 – user3375397

+0

爲什麼我應該在「SUM(C&i。)AS C&i之前使用逗號」。這些點的意義是什麼?你可以幫幫我嗎? – user3375397

1

這似乎實現你的結果的一個令人費解的方式,PROC概要可以做到這一點很容易利用結腸修改總結與C開頭的所有變量下面的代碼運行關閉的@Mike創建的數據集併產生相同的輸出。

proc summary data=data nway; 
class name1; 
var c: ; 
output out=want (drop=_:) sum=; 
run; 
+0

非常聰明的解決方案also.thank you.it工程。但我必須處理以'c'開頭的其他列。但沒有問題再次感謝你。 – user3375397

+0

然後只需將var語句更改爲c1-c3(或者在您的示例中爲c1-c8) – Longfish