2017-10-07 74 views
0

只是想比较单元格条目和返回值。比较单元格条目和返回值在SAS

coustmer_NO id A1 A2 A3 A4 
1   5 10 20 45 0  
1   13 0 45 2 5 
2   4 0 10 7 8 
2   3 7 9 55 0   
2   10 0 0 0 0 
3   4 90 8 14 3    
3   10 20 7 4 15  

如何之前出现030计数具有用于每个ID(值> 030)CUSTOMER_NO
然后,最小数目的值。

的预期结果会是这样的:

cosutmer_no , count_ac_num , values 
1     2   1  
2     1   1 
3     1   3 
+0

这是不是SQL数据步更好,使用SUBSTR – Reeza

+0

我已经尽力做到这一点,仍然面临一个问题吧。 –

+0

解释您发布的号码的逻辑。如果您计算的值大于30,那么为什么客户2只有一个时有3。为什么客户3有一个0,那么它也有一个值> 30? – Tom

回答

0

我会建议转化为更多的垂直结构。然后,您可以开始尝试应用您的业务逻辑,但我很难理解这是什么。

假设的报价是没有意义的(看起来就像有人喜欢"xxx"一个字符串,它有实际引号字符在它被写入到CSV文件等额外的引号,其中加入到保护现有报价于是成了"""xxx""")你可以使用compress()函数来删除它们。

然后,您可以将生成的字符串拆分为3个字符的子字符串。

data want ; 
    set have ; 
    array h history1 history2 ; 
    do history=1 to dim(h); 
    h(history)=compress(h(history),'"'); 
    length index 8 value $3 ; 
    do index=1 by 1 until (value=' '); 
     value=substrn(h(history),3*(index-1)+1,3); 
     if value ne ' ' then output; 
    end; 
    end; 
    drop history1 history2; 
run; 

所以,你最终的东西是这样的:

Obs id type history index value 

    1  1  13  1   1  STD 
    2  1  13  1   2  STD 
    3  1  13  1   3  058 
    4  1  13  1   4  030 
    5  1  13  2   1  STD 
    6  1  13  2   2  030 
    7  1  13  2   3  066 
    8  1  13  2   4  036 
    9  1  13  2   5  030 
10  1  13  2   6  STD 
11  1  13  2   7  STD 
12  1  13  2   8  STD 
13  1  13  2   9  STD 
14  1  13  2   10  STD 
15  1  3  1   1  STD 
16  1  3  1   2  STD 
17  1  3  1   3  STD 
18  1  3  1   4  XXX 
19  1  3  1   5  STD 
20  1  3  1   6  XXX 
21  1  3  1   7  S 
+0

嗨汤姆,非常感谢。我必须将其转换为新格式。你能否再次检查问题。 –