2013-03-28 29 views
0

我想創建存儲過程代碼爲SAS EG中的多個提示值...所以當我運行存儲過程我想給多個Fac_Nm .....我試圖使用case語句循環內部的子句的步驟sql

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 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子句的。你想使用宏條件,或者直接做 - 你根本不需要。在很樂意處理1倍的值,並且%做循環會很樂意處理的1

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

我相當肯定,這是我的想象來寫這個查詢,但最糟糕的方式結束值;您可能想回來並提交整個查詢的問題。你當然可以將所有的fac_nm存儲在一個宏變量中,用SELECT INTO;但即使這不是很聰明。聰明的辦法是在SQL正確做到這一點...

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

(假設你的原始查詢來自於一個,和你fac_nm的存儲在B)。甚至比這更好的是A和B之間的聯合,這更有效。