我有大约80个列名diag1到diag80。我想知道如何在procSqL中只选择30列并应用案例陈述。以下代码由于不理解范围而产生错误。
proc sql;
create table data_WANT as
select *,
case
when **diag1:diag30** in ('F00','G30','F01','F02','F03','F051') then 1
else 0
end as p_nervoussystem
from data_HAVE;
quit;
谢谢你,任何帮助都将不胜感激!
尝试的语法有两个问题。首先,PROC SQL不支持变量列表(因为SQL语法不支持它们(。第二,没有简单的语法来搜索N个变量以获得M个字符串的列表。
你需要某种循环。在SAS代码中要比在SQL中容易得多。
例如,您可以创建一个数组来引用您的30个变量,然后在变量上循环检查每个变量在值列表中是否都有值。一旦找到,您可以停止检查。
data want;
set have;
array vars diag1-diag30;
p_nervoussystem=0;
do index=1 to dim(vars) while (not p_nervoussystem);
p_nervoussystem = vars[index] in ('F00','G30','F01','F02','F03','F051');
end;
run;
@Tom搜索神经系统诊断代码的相反模式:
- 通过
FINDW
在观察到的诊断的串联上 - 通过观察到的诊断阵列上的CCD_ 2
data have;
infile datalines missover;
length id 8;
array dx(30) $5;
input id (dx1-dx50) (50*:$5.);
datalines;
1 A00 B00 A12
2 F00 Z12 T45
3 A01 A02 B12 F00
4 Q12
5 Q13
6 T14
7 F44 F45 F46
8 . . . . . . . . . . . . . . G30
;
data want;
length p_nervoussystem p_ns 4;
set have;
array dx dx:;
array ns(6) $5 _temporary_ ('F00','G30','F01','F02','F03','F051');
dx_catx = catx(' ', of dx(*));* drop dx_catx; * way 1;
do _n_ = 1 to dim(ns) until(p_nervoussystem);
p_nervoussystem = 0 < indexw(dx_catx, trim(ns(_n_))); * way 1;
p_ns = 0 < whichc(ns(_n_), of dx(*)); * way 2;
end;
run;```
尝试sys.tables和sys.columns并过滤您的列。
SELECT*FROM sys.tables INNER JOIN sys.columns ON columns.object_id=tables.object_id