2017-02-23 4 views
0

SAS의 새로운 기능이지만 예외적 인 문제가 발생했습니다. 내가 최근 달을 기반으로 변수를 동적으로 생성하는 몇 가지 proc SQL 문을 사용합니다. 검색하려는 테이블은 중간에 한 달 동안 이름이 있으며 루프를 반복하고 싶습니다. 예. LIBRARY.TABLE_JAN17_ALL LIBRARY.TABLE_DEC16_ALL 등SAS - 테이블 이름에 변수 사용

예제 코드 : -> LIBRARY.TABLEACC_ & vMonth 결말이 MONTHNAME 즉 LIBRARY_TABLEACC_JAN17 어디

DATA qtrMonth; 
INPUT vDay vMonth vMonthName $; 
DATALINES; 
31 01 JAN 
28 02 FEB 
31 03 MAR 
30 04 APR 
31 05 MAY 
30 06 JUN 
31 07 JUL 
31 08 AUG 
30 09 SEP 
31 10 OCT 
30 11 NOV 
31 12 DEC 
; 

DATA year; 
INPUT vYear ; 
DATALINES; 
14 
15 
16 
17 
; 
run; 

/* Next step is to do a cartesian join to populate 
    all possible Month & Year combos in the dataset */ 
PROC SQL; 
    create table popCalendar as 
    SELECT 
    mdy(a.vMonth,a.vDay, b.vYear) as MyDate format DATE9. 
    ,CAT(TRIM(a.vMonthName), b.vYear) as MonthName 
    FROM qtrMonth a 
    CROSS JOIN year b 
    ; 
quit; 

PROC SQL; 
create table tmpMax as 
Select Max(MyDate) as MaxDate 
FROM popCalendar 
WHERE MyDate < today(); 

/*select max monthName into vMonth variable */ 
SELECT trim(MonthName) into :vMonth 
FROM popCalendar a 
inner join tmpMAX b on a.MyDate = b.MaxDate; 
quit; 

/*Select from table using variable*/ 
proc sql; 
create table abc as 
select * from LIBRARY.TABLE_&vMonth._ALL; 

이전에, 나는 테이블 이름이 논리를 사용했다. 이 문제는 없었지만 변수가 테이블 이름의 중간에 오면 오류가 발생합니다. 오류 : 파일 LIBRARY.TABLE_JAN17.DATA가 존재하지 않습니다.

다음 코드를 사용하면 120 개월의 데이터를 반복하여 각 달마다 개별적으로 이름을 지정하지 않으려 고합니다. & 년.

%Let vMonth2 = JAN17; 

proc sql; 
create table abc as 
select * from LIBRARY.TABLE_&vMonth2._ALL ; 

문제는 누구에게 조언 할 수 있습니까?

감사합니다.

답변

0

두 가지 문제가 있습니다. 가장 간단한 방법은 매크로 변수에 공백을 삽입하는 것입니다. 그 이론을 테스트하기 위해서는 그 주위에 무언가로 값을 표시하십시오.

%put |&vmonth|; 

귀하의 SQL 코드는 매크로 변수를 만들 때 공백을 제거하기 위해 SAS를 강제로 (당신이 SAS의 이전 버전을 실행하는 경우의 대신 키워드로 구분하여 사용) 트리밍 키워드를 사용해야합니다.

SELECT MonthName into :vMonth trimmed 

다른 가능성은 SAS 컴파일러는 오브젝트 이름의 중간 매크로 기준을보고 혼동되어 실수 실제에 공백이 값이없는 경우에도 둘 이상의 토큰으로 처리된다는 것이다 . 그러나 이것은 일반적으로 매크로 변수 값이 매크로 인용 부호로 둘러싸인 경우에만 발생합니다. 값에 실제 공백이없는 것을 확인하면 %unquote() 매크로 기능을 사용해보십시오.

select * from LIBRARY.%unquote(TABLE_&vMonth._ALL); 
+0

트림 된 키워드가 작동했습니다. trim (monthName)을 사용했지만 이후에 공백이 있음을 깨닫지 못했습니다. – mugenheimer