>>67
合計でいいような気もするが、その場合は
proc summary nway;
class ID;
var Var1-Var3;
output sum=;
run;


特定の値("0")を捨てる、という意味なら
data temp1;
set _last_;
obs=_n_;
proc transpose data=temp1 out=temp2;
by obs ID;
var Var1-Var3;
proc sort data=temp2(drop=obs) out=temp3;
where COL1 ne 0;
by ID _NAME_;
data temp4;
set temp3;
by ID _NAME_;
if first._NAME_ then subID=0;
subID+1;
proc transpose data=temp4;
by ID subID;
run;

って感じか。
ID毎に1行になることが確実なら subID 生成ロジック(sortとtemp3&4)は不要。