2013-08-28 2 views
1

원더는 당신이 날사용 필드 값은

나는 열의 값은 또한 열의 필드 이름 인 데이터 집합을 가지고 도울 수 있다면. 수식에서 해당 필드를 호출하기 위해 열의 값을 사용할 수 있어야합니다.

예를 들어 ... 내가 열이

...

MERCH_NO 
V01 
M02 
V08 
M08 
AMOUNT 
PLAN 

레코드가 ... 같을 것이다 그리고 내가 CALC 필드가 수행 할 작업을

...

MERCH_NO  V01 M02 V08 M08 AMOUNT PLAN CALC 
123456  2  2 1 1 100.00 V01  value of V01 * AMOUNT 
456789  4  4 4 4 250.00 M08  value of M08 * AMOUNT 

만약의 계획 필드 레코드에 V01이라고 표시되면 V01 열의 값을 CALC 필드에 사용해야합니다. PLAN 필드에 M08이라면 M08 값을 사용해야합니다. 약 40 개의 계획이 있습니다.

답변

1

VVALUEX() 함수를 사용하는 정적 예제입니다. 상황에

data result; 
V01 = 2; 
AMOUNT=100; 
CALC = 'value of V01 * AMOUNT'; 
length arg1 arg2 $32; 
arg1 = scan(compress(CALC, 'value of'), 1); 
arg2 = scan(compress(CALC, 'value of'), 2); 
put arg1 arg2; 
result = input(VVALUEX(arg1), 16.) * input(VVALUEX(arg2), 16.); 
run; 

, 모든 변수의 CALC, 유형의 재잘과 형식을 알고 인식하는 논리를 만들어야 할 것 (VVALUEX() 반환 값을 포맷 이후).

동적 인 접근 방식이지만 많은 양의 데이터에 적합하지는 않지만 각 행에 대한 코드를 생성하는 것입니다 (아래 참조). 현재는 IF .. THEN에서 사용할 수있는 간단한 표현을 가정합니다.

data input; 
length CALC $50; 
input V01 M08 AMOUNT CALC 9-58; 
cards; 
2 1 100 value of V01 * AMOUNT 
2 4 100 value of M08 * AMOUNT 
; 
run; 

/* code generation */ 
data _null_; 
file 'mycalc.sas'; 
set input end=last; 

length line $150; 
if _N_=1 then do; 
    put 'data result;'; 
    put ' set input;'; 
end; 
line = 'if _N_ = ' || put(_N_, 8. -L) || 
     ' then RESULT = ' || compress(CALC, 'value of') || ';'; 
put line; 
if last then put 'run;'; 
run; 

%include 'mycalc.sas'; /* run the code */ 

좋아요, 지금 계획 필드에 대한 메모를 보지 못한 경우 - 필요에 따라 조정하십시오.

0

Vasja의 접근 방식이 옳습니다. 여기에 설명 된대로 PLAN 변수를 사용하는 접근 방식이 있습니다.

data have; 
input MERCH_NO  V01 M02 V08 M08 AMOUNT PLAN $; 
calc = input(vvaluex(plan),best12.) * amount; 
put calc=; 
datalines; 
123456  2  2 1 1 100.00 V01  
456789  4  4 4 4 250.00 M08  
;;;; 
run; 
+0

너희들은 훌륭하다 !!!!! 나는 VVALUEX까지 갔지만 그것을 적용하는 방법을 알 수 없었다. – Samuel