是否可以在sql中创建列变量数组以执行如下操作(请原谅语法):
array(Col1,Col2,Col3);
update tempTable
for(i=1;i<3;i++){
set array[i] =
case missing(array[i])
then 0*1
else
array[i]*1
end
};
注意:我正在SAS中使用proc SQL步骤
所需功能: 在表的多个列上的上述for循环中执行该操作,而无需为每个列编写单独的set语句。
答案 0 :(得分:3)
可以使用SAS宏来完成您想要的工作。
如果这是本地SAS表,则更容易使用“数据步骤”对其进行更新。
data have;
set have;
array v[3] col1 col2 col3;
do i=1 to 3;
v[i] = sum(v[i],0);
end;
drop i;
run;
sum()
函数对值求和(很明显)。如果缺少一个值,则不添加该值,并添加其余值。因此,如果缺少该列,您将得到0;否则,您将得到该列的值。
答案 1 :(得分:1)
SAS宏为您编写SAS代码。它们是生成SAS代码的预编译脚本。
您想要的代码看起来像
update table
set col1 = ... ,
col2 = ... ,
.... ,
;
这是一个脚本。它生成一个测试表,定义宏,然后在表上调用该宏。它使用其他答案中的sum()
函数。
data have;
array col[3];
do r=1 to 100;
do i=1 to 3;
if ranuni(123)> .8 then
col[i] = .;
else
col[i] = rannor(123);
end;
output;
end;
drop i r;
run;
%macro sql_zero_if_missing(data, cols);
%local n i col;
%let n=%sysfunc(countw(&cols));
proc sql noprint;
update &data
set
%do i=1 %to &n;
%let col=%scan(&cols,&i);
&col = sum(&col,0)
%if &i ^= &n %then , ;
%end;
;
quit;
%mend;
options mprint;
%sql_zero_if_missing(have, col1 col2 col3);
MPRINT
选项将使您看到生成的SAS代码。这是日志:
MPRINT(SQL_ZERO_IF_MISSING):proc sql noprint;
MPRINT(SQL_ZERO_IF_MISSING):更新已设置col1 = sum(col1,0), col2 = sum(col2,0),col3 = sum(col3,0);
注意:已更新100行 在WORK.HAVE中。
MPRINT(SQL_ZERO_IF_MISSING):退出;