2013-03-28 2 views
0

SAS EG에서 다중 프롬프트 값에 대한 저장 프로세스 코드를 작성하려고합니다. 저장된 프로세스를 실행할 때 여러 번 부여하려고합니다. Fac_Nm에 대한 값 .....proc sql의 where 절에서 루핑을 사용하여 case 문을 사용하려고합니다.

PROC SQL; 
    CREATE TABLE rpt_fac_prd_schd AS 
    select rpt.fac_id,fac.fac_nm as facility_name, schd.prd_id, prd.prd_nm 
       , bid_price_dt , bid_price, Table_top 
       , Remaining_resource_count label='rem_res_ct' as rem_res_ct, bid_price_tm 
       , today()-Load_Dt as Days_out 
    from TD.bid_price_rpt rpt Left Join SSIN.fac fac ON rpt.fac_id=fac.onesrc_fac_id 
        Left Join SSIN.FAC_PRD_SCHD schd ON rpt.fac_id=schd.fac_id 
         and rpt.bid_price_dt=schd.schd_dt 
        Left Join SSIN.PRD prd ON schd.prd_id=prd.prd_id 
/*where fac.Fac_Nm="&Fac_Nm" *//*If I use this it is selecting only first value enetered in the prompt*/ 
where fac.Fac_Nm =CASE when &Fac_Nm_COUNT = 1 then "&Fac_Nm" 
else do i=1 to &Fac_Nm_COUNT;/*Value of &Fac_Nm_COUNT is number of values I selected for Fac_Nm prompt*/ 
       "&&Fac_Nm&i" %end 

      and prd.prd_nm ="&Prd_Nm" 
      and calculated Days_Out Between &Days_out_str and &Days_out_end 
      and BID_PRICE_DT = "&arrival_dt"d 
      and BID_PRICE_TM Between "&arrival_str_tm"t and "&arrival_end_tm"t 
     Order by fac.fac_nm, prd.prd_nm, bid_price_dt, bid_price , Table_top desc 
       , Remaining_resource_count desc,bid_price_tm desc, Days_out desc; 
     QUIT; 

하지만 다음과 같은 오류가 발생합니다 ... 내가 실수를하고 있거나 다른 방법으로 주위에있는 아이디어가 있습니까 ???

ERROR: 
         else do i=1 to &Fac_Nm_COUNT; 
           _ 
           22 
           76 
ERROR 22-322: Syntax error, expecting one of the following: !, !!, &, (, *, **, +, -, '.', /, <, <=, <>, =, >, >=, AND, EQ, EQT, GE, GET, GT, GTT, LE, LET, LT, LTT, NE, NET, OR, ^=, |, ||, ~=. 

ERROR 76-322: Syntax error, statement will be ignored. 

답변

0

SQL 문 내부를 반복 할 수 없습니다.

해결하고자하는 더 광범위한 문제를 설명하는 또 다른 질문을 게시하는 것이 좋습니다.

0

SAS에는 "루핑 된 case 문"과 같은 것이 없습니다. 여기에 두 가지를 결합하고 있습니다. 여기에 매크로 루프를 만들고 싶습니다.

where fac.Fac_Nm = 
      CASE when &Fac_Nm_COUNT = 1 then "&Fac_Nm" 
      else %do i=1 %to &Fac_Nm_COUNT; 
         "&&Fac_Nm&i" %end; end 

여기에도 CASE WHEN을 사용하고 싶지 않습니다. 그것은 select 절을위한 것입니다. 당신은 매크로 조건문을 사용하거나, 직접 매크로를 사용하기를 원한다. if를 전혀 필요로하지 않는다. IN 행복 한 값을 처리하고, % 루프 행복하게 나는 이것이 내가이 가능하지만,이 쿼리를 작성하는 상상할 수있는 최악의 방법입니다 상당히 확신 1.

where fac.Fac_NM in (%do i = 1 %to ... %end;) 

의 최종 값을 처리 할 않는다 다시 돌아와 전체 쿼리와 함께 질문을 제출할 수 있습니다. 모든 fac_nm을 SELECT INTO와 함께 단일 매크로 변수에 저장할 수 있습니다. 하지만 그다지 똑똑하지는 않습니다. 스마트 한 방법은

where exists (select 1 from B where A.fac_nm = B.fac_nm); 

(원래 쿼리가에서 오는 가정하고 fac_nm 년대는 B에 저장됩니다) ... SQL에서 제대로이 작업을 수행하는 것입니다. 이것보다 훨씬 더 효율적 인 A와 B 사이의 조인입니다.

관련 문제