2013-08-06 3 views
1

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

저에게 TSQL/etc와 같은 느낌이 듭니다. 일반적으로 이것을 WITH 절/질의/어떤 것으로 실행 하겠지만 SAS는 불행하게도 그러한 절이 없습니다. – Joe

+1

maindata 및 기타 데이터의 모양에 대한 자세한 정보를 제공하면 누군가가 더 나은 접근 방식을 제안 할 수 있습니다. – scott

답변

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; 
+0

플롯 트위스트는 이미 fcmp를 사용하고 있으며 불행히도 값이 매번 다시 계산된다는 것입니다. 더 나쁜 것은 fcmp가 sql과 잘 작동하지 않으며 때때로 재 계산하는 동안 내 세션이 충돌합니다. 나는 어떤 견해인지 모르지만 그것을 시도 할 것이다. 감사 ! – Pane

+0

보기는 사실 실제로 테이블을 만들지 않고 테이블을 만드는 지침입니다. 그것은 테이블에 똑같이 (대부분) 접근 할 수 있지만, 이런 종류의 일에 편리합니다. – Joe