2017-06-01 146 views
0

基本上,我想要做的是在修改表格时使用最小/最大功能。我正在修改一个表格,添加一列,然后将该列设置为最小/最大函数的组合。但是,在SAS中,您不能使用汇总功能。有没有办法解决这个问题?SAS中的最小/最大功能解决方案

还有更多的输入,但为了清晰起见,缩写版本在下面!谢谢!

%let variable = 42 


    alter table X add Z float; 
     update X 
      set C = min(max(0,500 - %sysevalf(variable)),0); 
+0

你是不是想使这个'分钟(MAX(0,500-42),0)'或'分钟(MAX(0,500变量),0 )'?你有第二个,但我想知道你是否想要第一个。 – DomPazz

+0

我想要第一个。有很多变量被设置为在程序开始时输入的特定数字,我正在调用这些值本身。因此,表达式将评估为0. – indiansrulz

+0

您是否尝试使用SQL聚合函数'min()'和'max()'或SAS函数'min(,)'和'max(,)'?由于有多个参数,并且文本提到了“汇总”功能,该程序正在使用较晚的版本。 – Tom

回答

1

首先,让我们除去%sysevalf(),他们不需要和格式可读性

alter table claims.simulation add Paid_Claims_NoISL float; 
update claims.simulation 
    set Paid_Claims_NoISL 
    = min(
      max(0 
       , Allowed_Claims -&OOPM 
       , min(Allowed_Claims 
        ,&Min_Paid+ max(Allowed_Claims - &Deductible * &COINS 
            ,0 
           ) 
       ) 
       , &Ind_Cap_Claim 
     ) 
     ); 

注意,第一min()只有1个说法。这是导致你的错误。 SAS认为,因为它只有1个输入,所以您想总结一个列,这在更新中是不允许的。

就拿了这一点,它应该工作:

alter table claims.simulation add Paid_Claims_NoISL float; 
update claims.simulation 
    set Paid_Claims_NoISL 
    = max(0 
      , Allowed_Claims -&OOPM 
      , min(Allowed_Claims 
       ,&Min_Paid+ max(Allowed_Claims - &Deductible * &COINS 
           ,0 
          ) 
      ) 
      , &Ind_Cap_Claim 
    ); 
0

要引用宏变量的值,您需要使用&。

%let mvar = 42; 
proc sql; 
update X set C = min(max(0,500 - &mvar),0); 
quit; 

注意没有必要使用宏功能%SYSEVALF()因为SAS可以更容易地处理的情况下,当值&mvar比宏处理器罐的表达式。

%let mvar = 500 - 42; 
proc sql; 
update X set C = min(max(0,&mvar),0); 
quit; 
+0

哦是的。我很抱歉,我忘了包括这一点。我在调用每个变量之前都有“&” – indiansrulz

+0

我不断收到错误:错误:列Paid_Claims_NoISL引用的值表达式不能直接包含汇总函数。 – indiansrulz

+0

在您发布在MIN()函数下面的更复杂的代码中,只有一个参数。因此,SAS认为您希望汇总所有观察结果,而在这个简单的更新声明中您无法做到这一点。你真的想要通过许多观察的最小值?或者你只是想使用min()函数来设置最大值? – Tom