子查询中的计算变量

时间:2013-08-06 16:03:09

标签: sql subquery sas proc-sql

我对PROC SQL专家提出了一个问题。我有这段代码:

    proc sql;
    create table FinalData as 
    select * 
            ,Sum(starting_year,year_diff) as colsum
            ,Price*(1+(SELECT Return from OtherData where Year=calculated colsum)) as PriceFinal
   from MainData;
   quit;

显然calculated关键字不起作用,我认为变量必须在同一个选择上。我希望能够在一个sql语句中计算和使用子查询中的colsum。我想避免在每个子查询中重新计算colsum,因为最终我将使用更复杂的函数,如果每次重新计算,可能会减慢代码速度。

我发现这个question似乎差不多,但我没有设法使代码与该答案一致。

编辑:稍微更改了代码。

实际上它应该是Year=calculated colsum。 OtherData基本上是一个引用表,其中Year没有重复项。这是一个例子:

           MainData                     OtherData
  [Price] [starting_year] [year_diff]         [Return] [Year]
    5.00         2010          5                 0.04    2015
    2.33         2013          3                 0.02    2016
    4.51         2011          1                 0.005   2017
                                                 0.1     2018

会有缺失值,那很好。我知道这可以通过多个proc sql语句轻松完成,但挑战是在单个语句中完成。 SUM可以是生成要在OtherData中查找的输出的任何其他函数。

有办法做到这一点吗?

1 个答案:

答案 0 :(得分:2)

特定问题的一个部分解决方案是将您的功能定义为功能。 SQL可能足够聪明,不能重新计算两次相同的东西,虽然当然使用SQL你永远不知道 - 但它值得一试。至少使用已编译的函数,您可以获得一些效率,并且可以使用更多的SQL指针来正确执行它。

proc fcmp outlib=work.funcs.test;
function bmi(weight,height);
return (weight/height**2);
endsub;
quit;
options cmplib=work.funcs;
proc sql;
select bmi(weight,height) as bmi,
        (select count(1) from sashelp.class S where bmi(s.weight,s.height) le bmi(c.weight,c.height)) as less
    from sashelp.class C;
    quit;

您还可以使用计算变量创建视图并使用:

proc sql;
create view temp as select *, bmi(weight,height) as bmi from sashelp.class;
create table mytable as select C.*, (select count(1) from sashelp.class S where bmi(s.weight,s.height) le C.bmi) from temp C;
quit;