我正在尝试根据某些值是否存在为一行数据分配分类。利用下面的示例代码,我已经到了一个我遇到困难的地方。
preg_match('/^[^.][^?*].*[^.]$/', $str)
最后,我想将在第二步'test2'中创建的每一行分类为一个列,该列查找每个字母列(A-F)中的值并将其标记为这样。因此,当Row仅在A列中有1时,它将被标记为'A',但是当一行中有多个列中的1时,如'D','E'和'F',我希望它被标记为D_E_F
答案 0 :(得分:2)
最好的方法是在数据步骤中:
data test3;
format classifier $32.;
set test2;
array vars[6] A B C D E F;
classifier = "";
do i=1 to 6;
if vars[i] then
classifier = catx("_",classifier,vname(vars[i]));
end;
drop i;
run;
我创建了一个长度为32的字符变量CLASSIFIER
。
我定义了一个对A到F列进行分组的数组。这使我可以轻松地遍历这些列。
初始化CLASSIFIER
变量。
循环遍历数组。如果值= 1,则将变量的名称添加到CLASSIFIER
字符串。
CATX(delim,str1,str2)
将str1
和str2
与中间的delim
连接起来。它还会删除空格。
VNAME(array[i])
返回array[i]
指向的变量的变量名。
最后删除i
循环变量,除非你真的想要它在输出中。
答案 1 :(得分:1)
我知道它很难看,但你可以用 CASE 语句在另一个字段中累积想要的结果。你有SQL小提琴here。
请注意,如果串联可能为空,则必须检查此条件以避免执行子串。
select
ID,
ID2,
STATUS,
SUM(SECONDS) AS SECONDS,
sum(case when task='A' THEN 1 ELSE 0 END) AS A,
sum(case when task='B' THEN 1 ELSE 0 END) AS B,
sum(case when task='C' THEN 1 ELSE 0 END) AS C,
sum(case when task='D' THEN 1 ELSE 0 END) AS D,
sum(case when task='E' THEN 1 ELSE 0 END) AS E,
sum(case when task='F' THEN 1 ELSE 0 END) AS F,
substring(
case when sum(case when task='A' THEN 1 ELSE 0 END) = 1 then '_A' else '' end
+ case when sum(case when task='B' THEN 1 ELSE 0 END) = 1 then '_B' else '' end
+ case when sum(case when task='C' THEN 1 ELSE 0 END) = 1 then '_C' else '' end
+ case when sum(case when task='D' THEN 1 ELSE 0 END) = 1 then '_D' else '' end
+ case when sum(case when task='E' THEN 1 ELSE 0 END) = 1 then '_E' else '' end
+ case when sum(case when task='F' THEN 1 ELSE 0 END) = 1 then '_F' else '' end,
2, len(case when sum(case when task='A' THEN 1 ELSE 0 END) = 1 then '_A' else '' end
+ case when sum(case when task='B' THEN 1 ELSE 0 END) = 1 then '_B' else '' end
+ case when sum(case when task='C' THEN 1 ELSE 0 END) = 1 then '_C' else '' end
+ case when sum(case when task='D' THEN 1 ELSE 0 END) = 1 then '_D' else '' end
+ case when sum(case when task='E' THEN 1 ELSE 0 END) = 1 then '_E' else '' end
+ case when sum(case when task='F' THEN 1 ELSE 0 END) = 1 then '_F' else '' end) - 1) as wantedOutput
from
test
GROUP BY
ID,
ID2,
STATUS