2014-03-14 6 views
0

여기에 새로운 이름이 있습니다.조건 목록에있는 이름에 대한 SAS 매크로 기반

직장에서 우리 데이터베이스 중 하나를 검색하기 위해 한 쌍의 매크로를 작성했습니다.

%LET SVlist=%str(R_PAR_SV_2012_VER3 R_PAR_SV); 
%LET ovlist=%str(R_PAR_OV_2012_VER3 R_PAR_OV); 




%LET FILTER= 
(DIAGNOS like 'S72%' or diagnos contains ' S72' or 
DIAGNOS like 'I21%' or diagnos contains ' I21' 
); 

%LET OVSELECT=PNR, 
      PNRQ, 
      INDATUM, 
      OP, 
      DIAGNOS, 
      HDIA, 
      alder, 
      SJUKHUS; 
%LET sVSELECT=&OVSELECT,UTDATUM,OPD1; 

%macro ovsql(ovlist); 
proc sql noprint; 
%let n=%sysfunc(countw(&ovlist)); 
    %do i=1 %to &n; 
     %let val = %scan(&ovlist,&i); 


     create table work.&val as 

      select &ovselect, 
'SV' as souce 
from r_par.&val 
      where pnrq='0'; 


    %end; 
quit; 
%mend; 

%macro svsql(svlist); 
proc sql noprint; 
%let n=%sysfunc(countw(&svlist)); 
    %do i=1 %to &n; 
     %let val = %scan(&svlist,&i); 


     create table work.&val as 

      select &svselect, 
'SV' as souce 
from r_par.&val 
      where pnrq='0'; 


    %end; 
quit; 
%mend; 

%ovsql(&ovlist); 
%svsql(&SVlist); 

(가) 위의 잘 작동 : 당신이 볼 수 있듯이

, 내가 bsically 데이터 세트의이 개 약간 다른 유형을 다루는 매크로 두 가지를 가지고 이것은 내가 그것을 사용하는 방법에 대한 exemple입니다. 이 두 가지 목록을 사용합니다 :

내가 목록에있는 집합이 문자 OV 포함되어있을 때 "OV 매크로"프로그램을 실행할 수 있도록 매크로를 통합 할 수있는 방법이 궁금 무엇입니까 이름과 SV에는 목록의 집합에 문자 SV가 포함됩니다. 이 작업을 수행 할 수 있습니까?

일부 변형을 시도했지만 참조가 가능하지 않은 시도입니다.

options mprint; 
%macro PSQL(list); 
proc sql ; 
%let n=%sysfunc(countw(&list)); 
    %do i=1 %to &n; 
     %let val = %scan(&list,&i); 
     %let g= 
%substr(&val,7,2); 
     ; 
     %put(&g); 

     %if &g=:SV %then %do; 

     create table work._&val as 

      select &svselect, 
'SV' as souce 
from r_par.&val 
      where pnrq='0'; 
      %end; 
      %else %if &g=:OV %then %do ; 
        create table work._&val as 

      select &ovselect, 
'OV' as souce 
from r_par.&val 
      where pnrq='0'; 
    %end; 
    %end; 
quit; 
%mend; 

%PSQL(R_PAR_SV_2012_VER3 R_PAR_OV_2012_VER3); 

정말 도움이 될 것입니다. 저는 sas 매크로 언어에 관해서는 초보자입니다. 미리 감사드립니다.

+1

'OPTIONS MPRINT;를 켜면 로그에 무엇을 넣을 수 있습니까? 특별한 오류가 있습니까? – mjsqu

답변

0

약간 씁니다. 2 개의 %if 블럭이 실제로 그다지 많은 것을 구매하지는 않습니다. 여전히 2 비트의 코드를 유지하고 있으며 나머지 코드는별로 흥미롭지 않거나 두 번 유지하기 어렵지 않습니다.

create table work._&val as 
     select &&shortval.select, "&shortval." as source 
      from r_par.&val 
      where pnrq='0'; 

지금 SV 또는 OV로 & shortval을 정의하는 무언가를 추가하고 블록의 모든 경우에 당신은 지금 %를 필요가 없습니다

당신은 가능성이 코드의 하나 개의 조각이를 작성할 수 있습니다. 나는이 목적을 위해 & g를 사용한다고 생각하는데, 그 목적이 있다면 shortval (g는 매크로 변수의 나쁜 이름 임)으로 이름을 바꾼 다음

과 같이 사용하십시오. 위의 코드 구조에 대한 일반적인 해설 :

일반적으로 이러한 방식의 매크로 구문 분석은 다른 방법보다 동일한 결과를 얻기가 다소 어렵습니다. 그렇게 할 수는 있지만 데이터 기반 매크로 호출보다 더 많은 작업과 오류가 발생하기 쉽고 유지 관리가 더 어려워집니다.

여러 개의 반복 데이터가 포함 된 단일 인수를 허용하는 매크로를 사용하는 대신 매크로를 단일 반복 매크로로 작성하고 프로그래밍 방식으로 여러 번 호출하십시오. IE는, 하나는 각 행이 포함 된 데이터 집합을 가지고, 변수 "유형"다음

R_PAR_SV_2012_VER3 
R_PAR_OV_2012_VER3 

그리고는 수행보다 쉽게 ​​전화를 제어 할 수 있습니다 그

proc sql; 
select cats('%PSQL(',type,')') into :psqllist separated by ' ' 
     from have; 
quit; 

&psqllist.; 

. 또한 여러 매크로 변수를 쉽게 포함하여 위의 조각을 더 쉽게 구현할 수 있습니다.

%macro psql(shortval=,val=); 
    create table work._&val as 
      select &&shortval.select, "&shortval." as source 
       from r_par.&val 
       where pnrq='0'; 
%mend psql; 

proc sql; 
select cats('%PSQL(val=',type,',shortval=',substr(type,7,2),')') into :psqllist separated by ' ' 
     from have; 
quit; 
&psqllist.; 

을 이제 약 10 라인을 가지고 쉽게 코드를 더한 작은 데이터 집합을 유지의, 어떤 당신이 할 수있는 :이 의미

, 나는 위의 매크로를 작성하는 경우,이 같은 그것을 할 것이다 심지어 Excel 시트 또는 다른 데이터 소스 (이 값 목록을 가져올 위치에 따라 다름)에서 가져옵니다.