根据列值创建行并对其进行分类

时间:2017-07-12 13:02:19

标签: sql sas

我正在尝试根据某些值是否存在为一行数据分配分类。利用下面的示例代码,我已经到了一个我遇到困难的地方。

preg_match('/^[^.][^?*].*[^.]$/', $str)

最后,我想将在第二步'test2'中创建的每一行分类为一个列,该列查找每个字母列(A-F)中的值并将其标记为这样。因此,当Row仅在A列中有1时,它将被标记为'A',但是当一行中有多个列中的1时,如'D','E'和'F',我希望它被标记为D_E_F

2 个答案:

答案 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)str1str2与中间的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