0

我正在尝试为 SAS EG 中的多个提示值创建存储过程代码......所以当我运行存储过程时,我想为 Fac_Nm 提供多个值......

    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.
4

2 回答 2

0

您不能在 SQL 语句中循环。

我建议您发布另一个问题,描述您要解决的更广泛的问题。

于 2013-03-28T20:20:32.857 回答
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;那是为了选择子句。您想使用宏条件,或者直接使用 - 您根本不需要 if。IN 将愉快地处理 1 值,而 %do 循环将愉快地处理结束值 1。

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

不过,我相当肯定这是我能想象到的最糟糕的写这个查询的方式;您可能想回来提交一个包含整个查询的问题。您当然可以使用 SELECT INTO; 将所有 fac_nm 存储在一个宏变量中;但即使这样也不是很聪明。聪明的方法是在 SQL 中正确地做到这一点......

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

(假设您的原始查询来自 A,而您的 fac_nm 存储在 B 中)。比这更好的是 A 和 B 之间的连接,它更有效。

于 2013-03-28T20:21:03.870 回答