포스팅 목차
o MODIFY 구문
1. 목 적
MODIFY 구문은 새로운 SAS 데이터 세트를 추가로 생성하지 않고 기존에 존재하는 SAS 데이터 세트의 관측치에 대하여 대체, 삭제, 추가 작업을 수행한다. 비밀번호가 설정된 데이터 세트를 수정하려면, MODIFY 구문에 비밀번호 관련 데이터 세트 옵션(ALTER= or PW=)을 사용하여 비밀번호를 지정하라.
2. 문 법
MODIFY master-data-set <(data-set-option(s))> transaction-data-set< (data-set-option(s))> < NOBS=variable> <END=variable> <UPDATEMODE=MISSINGCHECK|NOMISSINGCHECK>; BY by-variable; MODIFY master-data-set <(data-set-option(s))> KEY=index </ UNIQUE> <NOBS=variable> <END=variable> ; MODIFY master-data-set <(data-set-option(s))>< NOBS=variable> POINT=variable; MODIFY master-data-set< (data-set-option(s))> <NOBS=variable> < END=variable>; |
1) Master-data-set
수정하기 원하는 SAS 데이터 세트를 지정하라. master-data-set을 DATA 구문에 동일하게 지정해야 한다.
다음에 나열된 제한 사항이 적용된다.
- 순차적 (Sequential) 접근 방식과 짝짓기(Matching) 접근 방식에서 Master 데이터 세트에는 SAS 데이터 파일, SAS/ACCESS 뷰(View), SQL 뷰 또는 LIBNAME 구문을 통한 DBMS 엔진 등을 지정할 수 있다. 그러나 데이터 세트 뷰(View) 또는 pass-through 뷰를 사용할 수는 없다.
- POINT= 옵션을 지정한 랜덤(Random) 접근 방식에서 Master 데이터 세트에는 SAS 데이터 파일 또는 SAS 데이터 파일을 참조하는 SQL 뷰(View)를 지정할 수 있다.
- KEY= 옵션을 지정한 직접(Direct) 접근 방식에서 Master 데이터 세트에는 SAS 데이터 파일 또는 LIBNAME 구문을 통한 DBMS 엔진을 지정할 수 있다. 만약 SAS 파일을 사용하면, Master 테이블에 인덱스가 생성되어야 하고, Index 이름을 KEY=옵션에 지정해야 한다.
제한사항 : | master-data-set을 DATA 구문에 동일하게 지정해야 한다. |
제한사항 : | 다음에 나열된 제한 사항이 적용된다. - 차적 (Sequential) 접근 방식과 짝짓기(matching) 접근 방식에서 Master 데이터 세트에는 SAS 데이터 파일, SAS/ACCESS 뷰(View), SQL 뷰 또는 LIBNAME 구문을 통한 DBMS 엔진 등을 지정 할 수 있다. 그러나, 데이터 세트 뷰(View) 또는 pass-through 뷰를 사용 할 수는 없다. - POINT= 옵션을 사용하는 랜덤(random) 접근 방식에서 Master 데이터 세트에는 SAS 데이터 파일 또는 SAS 데이터 파일을 참조하는 SQL 뷰(View)를 지정 할 수 있다. - KEY= 옵션을 사용하는 직접(direct) 접근 방식에서 Master 데이터 세트에는 SAS 데이터 파일 또는 LIBNAME 구문을 통한 DBMS 엔진을 지정 할 수 있다. 만약 SAS 파일을 사용하면, Master 테이블에 인덱스가 생성되어야 하고, Index 이름을 KEY=옵션에 지정해야 한다. - DBMS에서 KEY= 옵션은 DBKEY 키워드로 설정되고, 인덱스로 사용하기 위한 열 이름을 DBKEY=데이터 세트 옵션에 지정해야 한다. 이 열 이름은 DBMS에 전달되는 WHERE 구문을 적용하기 위하여 사용된다. |
2) (data-set-options)
SAS 데이터 세트명 바로 뒤의 괄호 안에 다수의 SAS 데이터 세트 옵션을 지정하라. 데이터 스텝에서 처리를 위하여 관측치를 읽을 때, 데이터 세트 옵션은 SAS가 취하는 행동을 지정한다. 데이터 세트 리스트에 적용되는 데이터 세트 옵션은 리스트에 있는 모든 데이터 세트에 적용된다.
3) Transaction-data-set
짝짓기 접근 방식에서 사용되는 값을 제공하는 SAS 데이터 세트를 지정한다. 이 값은 Master 데이터 세트를 업데이트하기 위하여 사용된다. DATA 스텝이 BY 구문을 포함하는 경우에만 이 데이터 세트를 지정하라.
제한사항 : | DATA 스텝이 BY 구문을 포함하는 경우에 이 데이터 세트를 지정하라. |
4) By-variable
작업을 수행하기 위하여 양쪽 테이블에서 대응하는 관측치를 식별하기 위한 하나 이상의 기준 변수를 지정하라.
5) END=variable
파일의 끝(End-of-file)을 표시하는 임시 변수를 생성하도록 지정한다.
설명 : | 변수의 값은 기본적으로 초기에 0으로 설정되고, MODIFY 구문에서 다음과 같은 경우에 1로 설정된다. - 수정되는 데이터 세트의 마지막 관측치를 읽는 경우(순차적 접근 방법 <4>) - Transaction 데이터 세트의 마지막 관측치를 읽는 경우(짝짓기 접근 방법 <1>) - MODIFY 구문이 KEY=값에 대한 일치하는 값을 찾을 수 없는 경우(랜덤 접근 방법 <2><3>) 이 변수 값은 출력 데이터 세트에 추가되지 않는다. |
제한사항 : | POINT= 인수가 사용되는 MODIFY 구문에서는 END= 인수를 사용하지 않기를 바란다. MODIFY 구문에서 POINT= 인수를 지정하면 랜덤 접근 방식이 사용되는데, END= 변수의 값은 랜덤 접근 방식을 사용하는 경우에는 1로 설정되지 않는다. |
6) KEY=index
수정되는 SAS 데이터 파일(Master)에 존재하는 단순 또는 복합 인덱스를 지정한다. KEY=인수는 수정하기 위한 정보를 transaction 데이터 세트의 동일한 이름을 가지는 변수에 의해 제공받아서 인덱스 값을 기준으로 MASTER 데이터 세트의 관측치를 검색한다.
기본사항 : | 지정된 KEY= 값을 발견하지 못하면, 자동 변수 _ERROR_는 1로 설정되고, 자동변수 _IORC_은 SYSRC 자동호출(autocall) 매크로부호 _DSENOM의 상태값을 반환한다. |
제한사항 : | KEY= 처리 방식은 SAS/ACCESS 엔진에 따라 다르다. 더 상세한 정보는 SAS/ACESS 도움말을 참고하라. |
Tip : | 인덱스 값에 대한 소스로 별도의 SET 구문에서 지정되는 SAS 데이터 세트와 INPUT 구문을 사용하여 읽히는 외부 파일을 사용 할 수 있다. |
Tip : | Master 파일에 중복값이 존재하면, 중복값 중에서 첫 번째 값이 수정된다. Master 데이터세트에 있는 모든 중복값을 transaction 값으로 수정하기 위해서는, Master파일의 중복값들에 대하여 KEY= 옵션을 사용하여 SET 구문을 여러 번 반복적으로 적용하기 위하여 DO 반복문을 사용하라. |
Tip : | 만약 Transaction 데이터 세트에 연속적으로 중복값이 존재하면, 중복되는 값들이 Master 데이터 세트에서 일치하는 값을 검색할 때마다 인덱스의 상단에서 다시 검색을 시작하도록 하기 위하여 UNIQUE옵션을 사용하라. Master 데이터 세트의 관측치에 중복된 각각의 transaction 값을 누적하여 더하기 위하여 누적 구문을 사용하라. UNIQUE옵션을 사용하지 않으면 transaction의 중복된 값 중에서 첫 번째 관측치 값이 Master 데이터의 관측치를 수정한다. |
Tip : | Transaction 데이터 세트의 중복값이 비연속적으로 존재하면, 매번 자동적으로 인덱스의 상단에서 검색이 시작되기 때문에 각각의 중복값이 Master 데이터 관측치에 적용된다. 각각의 중복된 관측치 값을 Master에 누적하여 더하기 위하여 누적 구문을 사용하라. |
관련사항 : | UNIQUE |
주요기능 : | 예제4 : 인덱스를 사용하여 관측치 수정하기 예제5 : 중복 인덱스 값 처리 예제6 : I/O 제어하기 |
7) NOBS=variable
입력 데이터 세트의 전체 관측치 개수가 할당되는 임시 변수를 생성한다. 뷰(View)에 대하여는 관측치 개수를 정의할 수 없다. 이런 경우에 SAS는 운영 환경에서 지정할 수 있는 가장 큰 양의 정수 값을 NOBS= 변수의 값으로 설정한다.
설명 : | 컴파일 시점에 SAS는 데이터 세트의 기술 정보 영역(descriptor portion)을 읽어서, 자동적으로 NOBS= 변수의 값을 할당한다. 그러므로, MODIFY 구문 실행 전에 NOBS=변수를 참조 할 수 있다. 변수는 데이터 스텝에서 사용되지만 새로운 데이터 세트에 추가되지 않는다. |
Tip : | NOBS= 와 POINT= 옵션은 서로 독립적이다. |
주요기능 : | 예제3 : 관측치 번호로 수정 대상을 검색하여 관측치 수정 |
8) POINT=variable
관측치 번호를 사용하여 랜덤(직접) 접근 방식으로 SAS 데이터 세트를 읽는다. Variable에는 읽기 위한 관측치의 번호를 관측치 값으로 소유하고 있는 변수를 지정한다. POINT=변수는 DATA 스텝의 어디서나 지정할 수 있지만, SAS 데이터 세트에 추가되지 않는다.
제한사항 : | POINT= 인수를 사용하는 경우에 다음 프로그래밍 구문 중에 하나를 선택하여 함께 사용하라. - STOP 구문 - POINT= 변수의 유효하지 않는 값을 체크하는 프로그래밍 로직 POINT= 옵션은 지정된 관측치만을 읽기 때문에 SAS는 파일을 순차적으로 읽을 때처럼 파일의 끝(end-of-file) 조건을 찾을 수 없다. 일반적으로 파일의 끝 조건을 감지하면 데이터 스텝을 자동적으로 종료하지만, POINT=를 사용하는 경우에는 데이터 스텝을 종료하기 위한 다른 방법을 찾지 못하면 데이터 스텝에서 무한 반복 상태가 발생할 수 있다. |
제한사항 : | 다음 항목과 POINT= 옵션을 함께 사용 할 수 없다. - BY 구문 - WHERE 구문 - WHERE= 데이터 세트 옵션 - Transport 출력형식 데이터 세트 - 순차적 데이터 세트(테잎 또는 디스크) - 다른 벤더의 관계형 DB 관리 시스템의 테이블 |
제한사항 : | 데이터 세트를 POINTOBS= 데이터 세트 옵션의 기본값인 YES로 지정하여 생성하였으면 압축 데이터 세트에 대하여 POINT= 옵션을 사용 할 수 있다. |
제한사항 : | SAS 버전 7 이상부터 압축된 파일에서 랜덤 접근 방식을 사용 할 수 있다. |
Tip : | POINT= 값이 관측치 번호와 일치하는 것이 없으면, 자동 변수 _ERROR_은 1로 설정된다. |
주요기능 : | 예제3 : 관측치 번호로 수정 대상을 검색하여 관측치 수정 |
9) UNIQUE
KEY= 인수에 지정된 변수를 기준으로 인덱스 검색을 수행할 때에 항상 Master 데이터 파일에 존재하는 인덱스의 상단에서 검색을 시작하도록 한다.
제한사항 : | UNIQUE 옵션은 KEY=옵션과 함께 사용되어야 한다. |
Tip : | Transaction 데이터 세트에 연속적인 중복 KEY=값이 존재하는 경우에 UNIQUE 옵션을 사용하면, Transaction 데이터 세트에서 각각의 중복된 값 마다 MASTER 데이터 세트에서 일치하는 값에 대한 검색이 인덱스 파일의 상단에서 시작하도록 한다. 누적 구문을 사용하여 값을 누적하여 더 할 수 있고, Transaction의 중복된 값들이 Master 데이터 세트의 해당 관측치를 계속 덮어쓰도록 하여 Transaction의 중복값 중 마지막 값이 Master 데이터 세트의 최종 관측치가 되도록 할 수 있다. |
주요기능 : | 예제5 : 중복 인덱스 값 처리 |
10) UPDATEMODE=MISSINGCHECK | NOMISSINGCHECK
Transaction 데이터 세트의 결측치 값으로 Master 데이터 세트의 관측값 수정을 허용할지 여부를 설정한다. UPDATEMODE 인수는 양쪽 테이블에서 일치하는 관측치를 확인하기 위한 기준 변수를 지정하는 BY 구문과 함께 사용되어야 한다.
(1) MISSINGCHECK
Transaction 데이터 세트의 결측치 값이 Master 데이터 세트의 값을 교체하지 못하도록 한다.
(2) NOMISSINGCHECK
Transaction 데이터 세트의 결측치 값을 사용하여 Master 데이터 세트의 값을 교체하도록 허용한다.
기본값 : | MISSINGCHECK |
필요사항 : | UPDATEMODE 인수는 양쪽 테이블에서 일치하는 관측치를 확인하기 위한 기준 변수를 지정하는 BY 구문과 함께 사용되어야 한다. |
Tip : | 그러나, 예외적으로 특별한 결측치 값은 MISSINGCHECK 옵션이 지정되어도 Master 데이터 세트의 값을 교체한다. |
3. 범 주
SAS 기본 구문 (파일 처리 구문)
4. 상세 설명
1) 짝짓기(Matching) 접근 방법
짝짓기 접근 방법은 Transaction 데이터 세트의 값과 Master 데이터 세트의 값이 일치하는 값을 찾기 위하여 BY 구문을 사용한다. BY 구문은 양쪽 데이터 세트에 존재하는 변수를 지정한다.
MODIFY 구문이 Transaction 데이터 세트에서 관측치를 읽어서 Master 데이터 세트에서 일치하는 관측치를 찾기 위하여 동적인 WHERE 처리를 수행한다. Master 데이터 세트의 관측치에 대하여 다음 작업을 수행한다.
- Transaction 데이터 세트의 값을 사용하여 Master 데이터 세트의 값을 교체한다.
- Master 데이터 세트의 값을 삭제한다.
- Master 데이터 세트에 관측치를 추가한다.
“예제2 : Transaction 데이터 세트를 사용하여 관측치 수정” 참조.
2) BY 값의 중복 (방식1)
Master와 Transaction 데이터 세트에서 BY 구문의 변수에 중복이 존재하는 경우에는 처리 방식에 영향을 준다.
- Mater 데이터 세트에 중복이 존재하면, 내부적으로 생성되는 WHERE 구문이 Master 데이터 세트에서 항상 첫 번째 위치하는 값을 처리하기 때문에, 첫 번째 위치하는 값이 갱신된다.
- Transaction 데이터 세트에 중복값이 존재하면, 중복값은 Master 데이터 세트의 관측값 위를 계속 덮어쓰게 되므로 Transaction의 중복값 중에서 최종값이 Master 데이터 세트의 최종값이 된다. Master 데이터 세트의 관측값에 Transaction의 중복값 모두를 더하도록 하기 위하여는 누적 문장을 사용하라.
3) 인덱스 값을 통한 직접(Direct) 접근 방식 (방식2)
직접 접근 방식은 수정되는 Master 데이터 세트에 생성되어 있는 인덱스 변수의 이름을 MODIFY 구문에서 KEY= 옵션으로 지정한다. Transaction 데이터 세트 (일반적으로 SET 구문에서 SAS 데이터 세트를 지정하거나 INPUT 구문에서 외부 파일을 읽는다.)에서 동일한 이름을 소유한 변수를 지정하여 Master 데이터 세트의 인덱스 검색을 위하여 사용되는 값을 제공한다. Modify 구문은 인덱스를 사용하여서 Master 데이터 세트에서 수정되는 대상 관측치를 검색하여 처리한다.
“예제4 : 인덱스를 사용하여 관측치 수정하기” 참조
4) 인덱스 값 중복 (방식2)
- Masetr 데이터 세트에서 인덱스가 생성된 변수에 중복값이 존재하면, 중복값 중에서 첫 번째 값에 대하여 검색, 수정, 교체 작업이 수행된다. Transaction 값을 사용하여 Master 의 중복값을 모두 수정하기 위하여DO 반복문을 사용하여서 SET문장과 KEY= 옵션이 여러 번 적용되도록 한다.
- Transaction 데이터 세트에 동일한 이름의 변수에 비연속적으로 중복값이 존재하면, MODIFY 구문은 Transaction의 값과 일치하는 인덱스 값을 소유한 Master 데이터 세트의 첫 번째 관측치에 Transaction 데이터 세트의 각각의 중복값을 덮어쓴다. 그러므로, Master 데이터 세트의 관측치에 Transaction 데이터 세트의 중복값 각각을 누적하여 더하기 위하여 누적 구문을 작성하지 않으면, Transaction 데이터 세트의 중복값 중 마지막 관측치 값이 Master 데이터 세트의 관측치 값이 된다.
- Transaction 데이터 세트의 변수에 중복값이 연속적으로 존재하면, Transaction의 중복값 중 첫 번째 관측치의 값은 Master 데이터 세트에 적용되지만, Transaction의 중복값 중의 두 번째 관측치의 값으로 Master 데이터 세트의 관측치를 찾으려고 하는 경우에 에러를 발생하고 종료한다. 이러한 에러를 피하기 위하여 MODIFY 구문에 UNIQUE 옵션을 함께 사용하라. UNIQUE 옵션은 인덱스 값에서 일치하는 값을 검색하기 전에 Master 데이터 세트에 존재하는 인덱스의 상단에서 검색을 다시 시작하도록 한다. 모든 중복된 값을 누적하기 위하여 누적 구문을 작성하라. 그렇지 않으면, 중복된 값 중에서 마지막 관측치가 Master 데이터 세트의 관측치에 적용된다.
“예제5 : 중복 인덱스 값 처리” 참조
- 양쪽 데이터 세트에 중복된 인덱스 값이 존재하면, Master 데이터 세트의 중복값에 Transaction 데이터 세트의 중복값을 적용하기 위하여 PROC SQL을 사용하라.
5) 관측치 번호를 사용하는 직접(랜덤) 접근 방식
Master 데이터 세트에서 수정하기 원하는 관측치의 번호의 값을 소유한 Transaction 데이터 세트의 변수를 지정하기 위하여 MODIFY 구문에 POINT=옵션을 사용할 수 있다. MODIFY 구문은 POINT=변수의 값을 사용하여서 수정하는 Master 데이터 세트의 관측치를 검색한다.
(데이터 세트가 POINTOBS= 데이터 세트 옵션의 기본값인 YES로 생성되었다면 압축 데이터 세트에서 POINT= 옵션을 함께 사용 할 수 있다.)
POINT=변수의 값에 대한 유효성을 확인하고, 자동 변수 _ERROR_의 상태를 확인하는 것은 좋은 프로그래밍 방식이다.
경고 : | POINT=는 무한 반복 상태를 발생 할 수 있다. POINT=를 사용하는 경우에 데이터 스텝을 종료시키기 위하여 다른 프로그래밍 로직을 사용하지 않으면 데이터 스텝은 무한 반복 상태를 발생 할 수 있다. |
6) 순차적 접근 방식 (방식4)
순차적 접근 방식은 MODIFY 구문의 가장 간단한 형태이다. 순차적 접근 방식을 사용하여 데이터 세트를 수정하기 위하여 NOBS= 와 END= 옵션을 사용할 수 있다. 그러나 POINT= 또는 KEY= 옵션은 함께 사용할 수 없다.
8) MODIFY 구문 사용 전에 데이터 세트 준비 사항.
성능을 향상하기 위한 방법과 MODIFY 구문을 사용하여 원하는 결과를 얻기 위한 방법에는 여러 가지가 있다.
9) 자동 변수 _IORC_와 SYSRC 자동호출(Autocall) Macro
자동 변수 _IORC_는 MODIFY 구문이 수행하는 각 I/O 작업에 대한 반환 코드를 포함한다. _IORC_의 값을 확인하기 위한 좋은 방법은 SYSRC 자동호출 매크로에서 제공되는 기호 코드(Mnemonic)와 함께 사용하는 것이다. 각각의 기호 코드는 한 가지 조건에 대하여 설명을 하는데, 기호코드는 데이터 스텝 프로그램에서 발생하는 문제를 확인하기 위한 편리한 방법이다. 다음은 유용한 코드 목록이다.
(1) _DSENMR
Transaction 데이터 세트의 관측치가 Master 데이터 세트에 존재하지 않는 상태를 표시한다. (MODIFY와 BY 구문이 사용되는 경우) 서로 상이한 BY 값을 가지는 관측치가 Master 데이터 세트에서 일치하는 값을 발견하지 못하면 _DSENMR을 반환한다.
(2) _DSEMTR
주어진 BY 값을 가지는 다수의 Transaction 데이터 세트의 관측치가 Master 데이터 세트에 존재하지 않는 경우 지정한다. (Modify와 BY 구문이 함께 사용되는 경우) 동일한 BY 값을 가지는 연속적인 관측치가 Master 데이터 세트에서 일치하는 값을 발견하지 못하면, 첫 번째 관측치 값은 _DSENMR으로 반환된고, 그 이후의 값들은 _DSEMTR으로 반환된다.
(3) _DSENOM
KEY= 옵션 또는 POINT= 옵션에서 요청되는 관측치가 Master 데이터 세트에 존재하지 않는 상태를 표시한다.
(4) _SENOCHN
중복을 허용하지 않는 인덱스가 생성된 Master 데이터 세트에 OUTPUT 구문 또는 REPLACE 구문 처리 결과로 Key 값에 중복이 발생하는 경우 지정한다.
(5) _SOK
검색을 통하여 일치하는 관측치를 발견한 상태를 표시한다.
참고 : | IORCMSG함수는 _IORC_의 현재 값과 연관된 에러 메시지에 출력형식(format)을 지정하여 반환한다. |
참고 : | 자동 변수 _IORC_와 SYSRC 자동호출 매크로를 사용하는 방법에 대하여 예제 6을 참조하라. |
10) 데이터 스텝에서 MODIFY 구문이 사용되는 경우 관측치 작성하기
데이터 스텝에서 MODIFY 구문을 사용하는 경우에 SAS데이터 세트에 관측치를 작성하는 방법은 아래의 나열된 구문의 존재 여부에 따라 달라진다.
(1) 명시적 문장을 지정 안 함(암묵적인 REPLACE 구문을 실행)
SAS 데이터 세트의 원본 파일의 해당 위치에 현재 관측치를 재작성한다. 데이터 스텝에서 마지막으로 이 작업을 처리한다. (REPLACE 구문이 데이터 스텝에서 마지막 문장으로 존재하는 것처럼 작동)
(2) OUTPUT 구문
OUTPUT 구문에 데이터 세트를 지정하지 않았으면, DATA 구문에서 지정된 모든 데이터 세트의 뒷부분에 현재 관측치를 작성한다. OUTPUT 구문에 데이터 세트가 지정되면, 프로그램은 지정된 데이터 세트의 뒷부분에 현재 관측치를 추가하여 작성한다. 작업은 OUTPUT 구문이 실행되는 곳에서 수행한다.
(3) REPLACE <data-set-name> 구문
지정된 데이터 세트에 현재 관측치를 재작성하거나, 만약 인수가 지정되지 않았으면 DATA 구문에 지정된 개별 데이터 세트에 현재 관측치를 재작성한다.
(4) REMOVE <data-set-name> 구문
지정된 데이터 세트에서 현재 관측치를 삭제하거나, 만약 인수가 지정되지 않았으면 DATA 구문에 지정된 개별 데이터 세트에서 현재 관측치를 삭제한다. 삭제는 데이터 세트가 존재하는 엔진의 특성에 따라 물리적 삭제 또는 논리적 삭제가 될 수 있다.
위 문장으로 작업을 수행하는 경우에 다음 사항을 기억하자.
- OUTPUT, REPLACE 또는 REMOVE 구문을 지정하지 않은 경우에 기본 작업은 REPLACE 구문이 사용된다.
- OUTPUT, REPLACE 와 REMOVE 구문은 서로 독립적이다. 하나의 관측치에 다수의 OUTPUT, REPLACE, REMOVE 구문을 사용 할 수 있다. 그러나, OUTPUT, REPLACE 또는 REMOVE 구문 중에 하나가 실행되면, 다음 차례의 REPLACE 또는 REMOVE 구문이 실행되기 전에 MODIFY 구문이 다시 실행되어야 한다.
다음 예제는 개별 관측치 마다 REPLACE 또는 OUTPUT 구문 중에 하나의 구문만이 실행되기 때문에, 조건 로직에서 OUTPUT 과 REPLACE 구문을 함께 사용 할 수 있다.
SAS Program |
data master;
modify master trans; by key;
if _iorc_=0 then replace;
else
output;
run;
다음 예제처럼 동일 관측치에 다중 REPLACE 작업을 수행하면 안된다.
SAS Program |
data master;
modify master;
x=1;
replace;
replace;
run;
개별 관측치마다 다수의 OUTPUT 구문을 사용 할 수 있다. 그러나, 다중 OUTPUT 구문을 사용 할 때 조심하라. 하나의 OUTPUT 구문의 사용으로 무한 루프가 발생할 가능성이 있다.
SAS Program |
data master;
modify master;
output;
run;
- 데이터 스텝에서 OUTPUT, REPLACE 또는 REMOVE 구문을 사용하면 기본적인 관측치 대체 작업은 실행되지 않는다. 데이터 스텝에서 앞의 구문 중에 하나를 사용하는 경우에는 수행하기 원하는 개별 작업을 프로그램 내에 정확하게 명시해야 한다.
- OUTPUT 구문과 REPLACE 또는 REMOVE 구문이 해당 관측치에 함께 적용되면, 관측치의 포인터의 위치를 정확하게 유지하기 위하여 OUTPUT 작업을 마지막으로 실행하라.
관측치를 작성하기 위하여 OUTPUT, REMOVE, REPLACE 구문을 적용하는 방법에 대하여는 예제7을 참조하라.
결측치와 MODEIFY 구문
기본적으로 UPDATEMODE=MISSINGCHECK 옵션이 적용되어서, transaction 데이터 세트의 결측치 값은 Master 데이터 세트에 존재하는 값을 대체하지 않는다. 그러므로, 일부 변수만을 수정하기를 원하고, 변수 내에서도 일부 관측치를 수정하려면, Transaction 데이터 세트에서 변경하지 않을 변수와 관측치 값을 결측값으로 설정하라. Transaction 데이터 세트의 결측값을 가지고 Master 데이터 세트의 존재하는 값을 수정하기를 원하면, UPDATEMODE =NOMISSINGCHECK 옵션을 사용하라.
비록 UPDATEMODE=MISSINGCHECK 옵션이 적용된 경우에도 Transaction 데이터 세트에 특별한 결측값 문자를 사용하여 결측치가 아닌 관측치 값을 결측치 값으로 대체 할 수 있다. Transaction 데이터 세트에 특별한 결측치를 생성하기 위하여 데이터 스텝에서 MISSING 구문을 사용하라. Transaction 데이터 세트에 특별한 결측치 값 A~Z 중에 하나를 정의하면, Master 데이터 세트의 수치형 변수는 특별한 결측값으로 갱신된다.
Master 데이터 세트의 최종 결과값이 표준 결측치 값으로 갱신되기를 원하는 경우에 Transaction 데이터 세트에서 관측치를 결측치 값으로 표현하기 위하여 단일 밑줄(_)을 사용하라. Master 데이터 세트의 최종값은 수치형 결측치 값에 대하여 마침표(.), 문자형 결측치 값에 대하여 공백으로 표현 할 것이다.
MODIFY 구문에서 데이터 세트 옵션을 함께 사용하기
프로그램에서 데이터 세트 옵션(KEEP=옵션과 같은)을 사용을 원하면 MODIFY 구문의 Master 데이터 세트에 옵션을 적용하라. DATA 구문에서 데이터 세트 옵션을 사용하는 경우에 예측하지 못한 결과가 발생 할 수 있다.
SAS/SHARE 환경에서 MODIFY문장 사용하기.
SAS/SHARE환경에서 MODIFY 구문은 관측치에 Update모드로 접근한다. 즉, 관측치는 MODIFY 구문이 데이터를 읽을 때부터 REPLACE 또는 REMOVE 구문이 실행 될 때까지 잠긴다. 관측치가 잠긴 시점 이후에 MODIFY 구문으로 관측치를 다시 읽을 때까지 접근 할 수 없다. MODIFY 구문은 Update모드로 데이터 세트를 열지만, 제어 수준은 사용되는 문장에 기반한다. 예를 들어, KEY= 옵션과 POINT=옵션은 Member-level 잠금 수준이 적용된다.
5. 비교 사항
- 데이터 스텝에서 MERGE, SET 또는 UPDATE 구문을 사용할 때, 새로운 SAS데이터 세트를 생성한다. 새롭게 생성된 데이터 세트의 데이터 세트 기술 정보는 기존의 데이터 세트의 기술 정보와는 다르게 변경된다.(변수 추가 또는 삭제, 레이블 변경 등) 그러나, 데이터 스텝에서 MODIFY 구문을 사용하는 경우에 새로운 데이터 세트를 생성하지 않기 때문에 데이터 세트 기술 정보는 변경되지 않는다.
- MODIFY 와 BY 구문을 함께 사용하면, 다음 항목을 제외하고 MODIFY 구문은 UPDATE 구문과 유사한 작업을 수행한다.
- Master 데이터 세트 또는 Transaction 데이터 세트는 기준 변수에 따라서 정렬되거나 인덱스가 반드시 존재할 필요가 없다. (MODIFY 구문과 함께 사용되는 BY 구문은 동적 WHERE 처리 방법에서 사용된다.)
참고 : | MODIFY 구문이 정렬되지 않거나 인덱스가 존재하지 않는 SAS 데이터 세트를 수정하는 경우에는 동적 WHRER 처리의 효율은 낮을 수 있다. 변수를 기준으로 데이터 세트가 정렬되어 있거나 인덱스가 존재하는 Master 데이터 세트와 기준 변수에 따라서 정렬되어 있는 Transaction 데이터 세트의 사용은 Overhead 처리를 줄일 수 있다. 특히 대용량 파일에 대하여 더욱 효율적이다. |
- Master 데이터 세트와 Transaction 데이터 세트는 BY 변수를 기준으로 중복값을 가지는 관측값에 대하여 작업을 수행 할 수 있다. MODIFY 구문은 중복값을 “1.짝짓기(Matching) 접근 방법 (방식1)”에서 설명한 내용과 같이 처리한다
- MODIFY 구문은 UPDATE 구문처럼 데이터 세트의 기술 정보(Descriptor)를 수정할 수 없다. 그러므로, MODIFY 구문은 변수 추가 또는 삭제, 레이블 변경 작업 등을 수행 할 수 없다.
6. 관련 구문
구문명 | 구문내용 |
BY 구문 | BY 구문은 데이터 세트에서 SET, MERGE, UPDATE 구문의 그룹별 관측치에 대한 처리 방식을 지정하고, 특수한 그룹화 변수를 내부적으로 생성한다. |
MERGE 구문 | MERGE 구문은 다수의 SAS 데이터 세트의 관측치를 하나의 관측치로 결합하여 새로운 SAS 데이터 세트를 생성한다. |
MISSING 구문 | MISSING 구문은 입력 데이터에서 수치형 데이터의 특별한 결측치 값을 표현하기 위한 문자를 지정한다. |
MODIFY 구문 | MODIFY 구문은 새로운 SAS 데이터 세트를 추가로 생성하지 않고 기존에 존재하는 SAS 데이터 세트의 관측치에 대하여 대체, 삭제, 추가 작업을 수행한다. |
OUTPUT 구문 | SAS 데이터 세트에 현재 처리 중인 관측치를 작성한다. OUTPUT 구문은 데이터 스텝의 종료 시점에 작성되지 않고, OUTPUT 구문이 실행되는 즉시 데이터 세트에 현재 관측치를 작성한다. |
REMOVE 구문 | SAS 데이터 세트에서 관측치를 삭제한다. |
REPLACE 구문 | 추가로 새로운 SAS 데이터 세트를 생성하지 않고 기존에 존재하는 SAS 데이터 세트에 존재하는 관측치를 대체(갱신)한다. |
SET 구문 | SET 구문은 하나 이상의 SAS 데이터 세트에서 관측치를 읽는다. |
UPDATE 구문 | Master 파일의 데이터 항목을 변경 및 삽입하기 위하여 Master 파일을 기준으로 Transactions 파일의 데이터 값으로 갱신(Update) 또는 삽입(Insert) 작업을 수행한다. |
[SAS Statement] SAS 데이터 스텝 구문 사전 목록]
7. 예 제
예제 데이터 세트
다음 예제는 INVTY.STOCK 데이터 세트를 수정한다. INVTY.STOCK 데이터 세트는 다음 변수로 구성된다.
- PARTNO
개별 공구의 중복이 존재하지 않는 유일한 번호를 관리하는 문자형 변수.
- DESC
개별 공구의 상세한 설명을 포함하는 문자형 변수
- INSTOCK
회사에서 개별 공구의 재고량을 관리하는 수치형 변수
- RECDATE
현재 INSTOCK값에 대한 SAS 날짜를 관리하는 수치형 변수
- PRICE
개별 공구의 단위 가격을 관리하는 수치형 변수
추가적으로, INVTY.STOCK는 PARTNO 변수에 단순 인덱스를 포함하고 있다. 다음 데이터 스텝은 INVTY.STOCK를 생성한다.
SAS Program |
libname invty 'SAS-library';
options yearcutoff= 1920;
data invty.stock(index=(partno));
input PARTNO $ DESC $ INSTOCK @17
RECDATE date7. @25 PRICE;
format recdate date7.;
datalines;
K89R seal 34 27jul95 245.00
M4J7 sander 98 20jun95 45.88
LK43 filter 121 19may96 10.99
MN21 brace 43 10aug96 27.87
BC85 clamp 80 16aug96 9.55
NCF3 valve 198 20mar96 24.50
KJ66 cutter 6 18jun96 19.77
UYN7 rod 211 09sep96 11.55
JD03 switch 383 09jan97 13.99
BV1E timer 26 03jan97 34.50
;
예제1 : 모든 관측치 수정하기
다음 예제는 INVTY.STOCK 데이터 세트의 모든 날짜를 현재 날짜로 교체한다. INVTY.STOCK에서 모든 관측치에 대하여 RECDATE변수의 값을 현재 날짜로 변경한다.
SAS Program |
data invty.stock;
modify invty.stock;
recdate=today();
run;
proc print data=invty.stock noobs;
title 'INVTY.STOCK';
run;
[PROC PRINT 결과물 : Stock 데이터 세트 – RECDATE 변수의 값 갱신]
Results |
INVTY.STOCK 1
PARTNO DESC INSTOCK RECDATE PRICE
K89R seal 34 14MAR97 245.00
M4J7 sander 98 14MAR97 45.88
LK43 filter 121 14MAR97 10.99
MN21 brace 43 14MAR97 27.87
BC85 clamp 80 14MAR97 9.55
NCF3 valve 198 14MAR97 24.50
KJ66 cutter 6 14MAR97 19.77
UYN7 rod 211 14MAR97 11.55
JD03 switch 383 14MAR97 13.99
BV1E timer 26 14MAR97 34.50
MODIFY 구문은 갱신 처리를 위하여 INVTY.STOCK를 열어서 데이터 스텝의 개별 반복에서 INVTY.STOCK의 하나의 관측치를 읽고, 프로그램에서 지정한 작업을 수행한다. 이 경우에 프로그램은 데이터 스텝의 모든 반복 중에 RECDATE의 값을 TODAY함수의 값으로 수정한다. 스텝의 끝에서 적용되는 암묵적인 REPLACE 구문은 INVTY.STOCK에서 기존에 존재하고 있는 개별 관측치를 수정한다.
예제2 : Transaction 데이터 세트를 사용하여 관측치 수정
다음 예제는 INVTY.STOCK 데이터 세트에서 재고가 새롭게 유입된 날짜로 갱신하고, 새롭게 받은 재고의 양을 추가한다. WORK라이브러리에 Transaction 데이터 세트 ADDINV는 새로운 데이터를 포함하고 있다.
ADDINV 데이터 세트는 수정하고자 하는 정보를 포함하고 있는 데이터 세트이다.
ADDINV 데이터 세트에는 다음 변수를 포함한다.
- PARTNO
INVTY.STOCK 데이터 세트에서 인덱스가 존재하는 PARTNO변수와 대응되는 문자형 변수다.
- NWSTOCK
개별 도구의 새롭게 입고된 재고의 양을 관리하는 수치형 변수다.
ADDINV 데이터 세트는 MODIFY 구문에서 두 번째에 위치하고 있다. 이 데이터 세트를 TRANSACTION 데이터 세트로 사용하여서 ADDINV에서 순차적으로 개별 관측치를 읽는다. BY 구문에서 공통 변수 PARTNO가 지정되었기 때문에, MODIFY 구문은 ADDINV데이터 세트에서 PARTNO 변수의 값과 INVTY.STOCK에서 PARTNO 변수의 일치하는 값을 검색한다. 일치하는 값을 찾아서 개별 관측치에 대하여 RECDATE 변수의 값을 현재 날짜로 변경하고, INSTOCK 변수의 값을 INSTOCK와 ADDINV 데이터 세트의 NWSTOCK 변수 합계로 수정한다. MODIFY 구문은 데이터 세트 기술정보를 수정하지 않으므로 INVTY.STOCK 데이터 세트에 NWSTOCK 변수를 추가하지 않는다. 그러므로, NWSTOCK변수를 제거하기 위한 DROP 구문이 따로 필요없다.
다음 예제는 INVTY.STOCK 데이터 세트를 수정하기 위한 정보를 포함하고 있는 Transaction 데이터 세트 ADDINV를 지정한다. BY 구문에는 INVTY.STOCK 데이터 세트의 관측치를 검색하기 위한 값을 포함하고 있는 공통 변수를 지정한다.
다음 데이터 스텝은 ADDINV 데이터 세트를 생성한다.
SAS Program |
data addinv;
input PARTNO $ NWSTOCK;
datalines;
K89R 55
M4J7 21
LK43 43
MN21 73
BC85 57
NCF3 90
KJ66 2
UYN7 108
JD03 55
BV1E 27
;
다음 데이터 스텝은 INVTY.STOCK 데이터 세트를 수정하기 위하여 ADDINV 데이터 세트의 값을 사용한다.
SAS Program |
libname invty 'SAS-library';
data invty.stock;
modify invty.stock addinv;
by partno;
RECDATE=today();
INSTOCK=instock+nwstock;
if _iorc_=0 then replace;
run;
proc print data=invty.stock noobs;
title 'INVTY.STOCK';
run;
[PROC PRINT 결과물 : invty.Stcok 데이터 세트]
Results |
INVTY.STOCK 1
PARTNO DESC INSTOCK RECDATE PRICE
K89R seal 89 14MAR97 245.00
M4J7 sander 119 14MAR97 45.88
LK43 filter 164 14MAR97 10.99
MN21 brace 116 14MAR97 27.87
BC85 clamp 137 14MAR97 9.55
NCF3 valve 288 14MAR97 24.50
KJ66 cutter 8 14MAR97 19.77
UYN7 rod 319 14MAR97 11.55
JD03 switch 438 14MAR97 13.99
BV1E timer 53 14MAR97 34.50
예제3 : 관측치 번호로 수정 대상을 검색하여 관측치 수정
다음 예제는 NEWP데이터 세트에서 TOOL_OBS의 값을 기준으로 수정하기 위한 관측치 번호를 읽어서 INVTY.STOCK 데이터 세트의 대상 관측치를 검색하여 수정한다. NEWP변수의 값으로 PRICE의 값을 수정하기 위하여 할당 문장을 지정한다.
데이터 세트 NEWP는 두 개의 변수로 구성되어 있다.
- TOOL_OBS
공구 회사의 Master 데이터 세트 INVTY.STOCK에 존재하는 개별 공구의 해당 관측치 번호.
- NEWP
개별 공구의 신규 가격.
다음 데이터 스텝은 NEWP를 생성한다.
SAS Program |
data newp;
input TOOL_OBS NEWP;
datalines;
1 251.00
2 49.33
3 12.32
4 30.00
5 15.00
6 25.75
7 22.00
8 14.00
9 14.32
10 35.00
;
다음 데이터 스텝은 INVTY.STOCK을 수정한다.
SAS Program |
libname invty 'SAS-library';
data invty.stock;
set newp;
modify invty.stock point=tool_obs
nobs=max_obs;
if _error_=1 then
do;
put 'ERROR occurred for TOOL_OBS=' tool_obs /
'during DATA step iteration' _n_ /
'TOOL_OBS value might be out of range.';
_error_=0;
stop;
end;
PRICE=newp;
RECDATE=today();
run;
proc print data=invty.stock noobs;
title 'INVTY.STOCK';
run;
[PROC PRINT 결과물 : invty.Stcok 데이터 세트]
Results |
INVTY.STOCK 1
PARTNO DESC INSTOCK RECDATE PRICE
K89R seal 34 14MAR97 251.00
M4J7 sander 98 14MAR97 49.33
LK43 filter 121 14MAR97 12.32
MN21 brace 43 14MAR97 30.00
BC85 clamp 80 14MAR97 15.00
NCF3 valve 198 14MAR97 25.75
KJ66 cutter 6 14MAR97 22.00
UYN7 rod 211 14MAR97 14.00
JD03 switch 383 14MAR97 14.32
BV1E timer 26 14MAR97 35.00
예제4 : 인덱스를 사용하여 관측치 수정하기
다음 예제는 ADDINV 데이터 세트에서 PARTNO 변수의 값을 INVTY.STOCK 데이터 세트의 인덱스를 통하여 PARTNO 변수의 일치하는 값을 검색하도록 전달하기 위하여 KEY=옵션을 사용한다. ADDINV는 예제2에서 생성된다.
KEY= 인수는 MODIFY 구문에서 Master 데이터 세트의 데이터 수정을 위하여 직접적으로 관측치에 접근하는 것을 허용하는 인덱스 값을 검색하도록 Transaction 데이터 세트의 값을 전달한다. 내부적으로 동적 WHERE 처리가 발생되지 않는다. 다음 예제에서, Master 데이터 세트 INVTY.STOCK에서 INSTOCK 변수의 값에 transaction 데이터 세트 ADDINV의 NWSTOCK 변수의 값을 추가한다.
SAS Program |
libname invty 'SAS-library';
data invty.stock;
set addinv;
modify invty.stock key=partno;
INSTOCK=instock+nwstock;
RECDATE=today();
if _iorc_=0 then replace;
run;
proc print data=invty.stock noobs;
title 'INVTY.STOCK';
run;
[PROC PRINT 결과물 : invty.Stcok 데이터 세트]
Results |
INVTY.STOCK 1
PARTNO DESC INSTOCK RECDATE PRICE
K89R seal 89 14MAR97 245.00
M4J7 sander 119 14MAR97 45.88
LK43 filter 164 14MAR97 10.99
MN21 brace 116 14MAR97 27.87
BC85 clamp 137 14MAR97 9.55
NCF3 valve 288 14MAR97 24.50
KJ66 cutter 8 14MAR97 19.77
UYN7 rod 319 14MAR97 11.55
JD03 switch 438 14MAR97 13.99
BV1E timer 53 14MAR97 34.50
예제5 : 중복 인덱스 값 처리
MODIFY 구문에서 Master 데이터 세트의 인덱스를 검색하기 위한 값을 제공하는 SET 구문의 newinv 데이터 세트 변수에 중복값이 존재하는 경우에 대한 처리 방법을 보여준다.
NEWINV 데이터 세트는 Master 데이터 세트를 수정하기 위한 정보를 포함하고 있다.
NEWINV 데이터 세트는 다음 변수로 구성된다.
- PARTNO
INVTY.STOCK 데이터 세트에서 인덱스가 존재하는 PARTNO 변수를 검색하기 위하여 전달되는 문자형 변수다. NEWINV데이터 세트의 PARTNO 변수에 중복값이 존재한다. (M4J7값이 중복되어 발생)
- NWSTOCK
개별 공구에 대한 신규 재고의 양을 관리하는 수치형 변수다.
다음 데이터 스텝은 NEWINV데이터 세트를 생성한다.
SAS Program |
data newinv;
input PARTNO $ NWSTOCK;
datalines;
K89R 55
M4J7 21
M4J7 26
LK43 43
MN21 73
BC85 57
NCF3 90
KJ66 2
UYN7 108
JD03 55
BV1E 27
;
다음 데이터 스텝은 INVTY.STOCK의 NEWINV 변수에서 M4J7을 기준으로 두 번째로 일치하는 값에 대한 검색을 시작하는 경우에 에러를 발생하고 종료한다.
SAS Program |
libname invty 'SAS-library';
/* 다음 데이터 스텝은 에러 발생 후 종료한다! */
data invty.stock;
set newinv;
modify invty.stock key=partno;
INSTOCK=instock+nwstock;
RECDATE=today();
run;
SAS 로그에 다음 메시지가 출력된다.
[LOG 출력결과]
Results |
ERROR: No matching observation was found in MASTER data set.
PARTNO=K89R NWSTOCK=55 DESC= INSTOCK=. RECDATE=14MAR97 PRICE=.
_ERROR_=1 _IORC_=1230015 _N_=1
NOTE: Missing values were generated as a result of performing
an operation on missing values.
Each place is given by:
(Number of times) at (Line):(Column).
1 at 689:19
NOTE: The SAS System stopped processing this step because of
errors.
NOTE: The data set INVTY.STOCK has been updated. There were 0
observations rewritten, 0 observations added and 0
observations deleted.
Transaction 데이터 세트에 존재하는 중복값에 의한 에러를 방지하기 위하여 MODIFY 구문에 UNIQUE 옵션을 추가한다. UNIQUE 옵션은 SET 구문의 값을 전달받아서 KEY= 인수에 지정된 변수를 기준으로 인덱스 검색을 수행 할 때 마다 항상 인덱스의 상단에서 검색을 다시 시작하도록 한다. 그러므로, SET 데이터 세트에서 중복값 “M4J7” 각각은 MASTER 데이터 세트에서 “M4J7” 값을 검색 할 수 있다.
INSTOCK 변수에서 M4J7의 최종 결과값(145)은 NEWINV 데이터 세트에서 NWSTOCK 변수의 중복된 2개의 값(21,26)과 INVTY.STOCK 데이터 세트에서 INSTOCK변수의 값(98)을 더하여 계산되었다. 누적 문장을 사용하여 M4J7의 값을 누적하여 더하였다. 누적문장을 사용하지 않으면 NEWINV 데이터세트에서 M4J7의 마지막 관측값(26)이 INVTY.STOCK 데이터 세트의 최종 결과값이 될 것이다.
SAS Program |
data invty.stock;
set newinv;
modify invty.stock key=partno / unique;
INSTOCK=instock+nwstock;
RECDATE=today();
if _iorc_=0 then replace;
run;
proc print data=invty.stock noobs;
title 'Results of Using the UNIQUE Option';
run;
[PROC PRINT 결과물 : invty.Stcok 데이터 세트]
Results |
Results of Using the UNIQUE Option 1
PARTNO DESC INSTOCK RECDATE PRICE
K89R seal 89 14MAR97 245.00
M4J7 sander 145 14MAR97 45.88
LK43 filter 164 14MAR97 10.99
MN21 brace 116 14MAR97 27.87
BC85 clamp 137 14MAR97 9.55
NCF3 valve 288 14MAR97 24.50
KJ66 cutter 8 14MAR97 19.77
UYN7 rod 319 14MAR97 11.55
JD03 switch 438 14MAR97 13.99
BV1E timer 53 14MAR97 34.50
예제6 : I/O 제어하기
다음 예제는 I/O 상태를 제어하기 위하여 SYSRC 자동호출 매크로와 _IORC_ 자동 변수를 사용한다. 이 프로그래밍 방법은 예기치 않은 결과를 방지하는데 도움을 준다. INVTY.STOCK를 수정하기 위하여 인덱스를 통한 직접(Direct) 접근 방식을 사용한다. NEWSHIP 데이터 세트의 데이터를 사용하여 INVTY.STOCK 데이터 세트를 수정한다.
다음 데이터 스텝은 NEWSHIP 데이터 세트를 생성한다.
SAS Program |
options yearcutoff= 1920;
data newship;
input PARTNO $ DESC $ NWSTOCK @17
SHPDATE date7. @25 NWPRICE;
datalines;
K89R seal 14 14nov96 245.00
M4J7 sander 24 23aug96 47.98
LK43 filter 11 29jan97 14.99
MN21 brace 9 09jan97 27.87
BC85 clamp 12 09dec96 10.00
ME34 cutter 8 14nov96 14.50
;
SELECT 구문에서 개별 WHEN 절은 MODIFY 구문이 수행하는 작업에 대하여 SYSRC 자동호출 매크로를 통하여 전달되는 각각의 I/O(INPUT/OUTPUT) 반환 코드에 대한 처리 방법을 지정한다.
_SOK는 MODIFY 구문이 성공적으로 작업을 완료 하였다는 상태를 표시한다.
_DSENOM은 마스터 데이터 세트 INVTY.STOCK 에서 일치하는 관측치를 발견하지 못한 상태를 표시한다. OUTPUT 구문은 INVTY.STOCK 데이터 세트에 관측치를 추가하도록 지정한다. 출력 데이터 세트에서 마지막 관측치를 확인하라.
이 외의 코드가 SYSRC에 의하여 반환되면, 데이터 스텝이 종료되고, PUT 구문은 로그에 메시지를 출력한다.
SAS Program |
libname invty 'SAS-library';
data invty.stock;
set newship;
modify invty.stock key=partno;
select (_iorc_);
when (%sysrc(_sok)) do;
INSTOCK=instock+nwstock;
RECDATE=shpdate;
PRICE=nwprice;
replace;
end;
when (%sysrc(_dsenom)) do;
INSTOCK=nwstock;
RECDATE=shpdate;
PRICE=nwprice;
output;
_error_=0;
end;
otherwise do;
put
'An unexpected I/O error has occurred.'/
'Check your data and your program';
_error_=0;
stop;
end;
end;
run;
proc print data=invty.stock noobs;
title 'INVTY.STOCK Data Set';
run;
[PROC PRINT 결과물 : invty.Stcok 데이터 세트]
Results |
INVTY.STOCK Data Set 1
PARTNO DESC INSTOCK RECDATE PRICE
K89R seal 48 14NOV96 245.00
M4J7 sander 122 23AUG96 47.98
LK43 filter 132 29JAN97 14.99
MN21 brace 52 09JAN97 27.87
BC85 clamp 92 09DEC96 10.00
NCF3 valve 198 20MAR96 24.50
KJ66 cutter 6 18JUN96 19.77
UYN7 rod 211 09SEP96 11.55
JD03 switch 383 09JAN97 13.99
BV1E timer 26 03JAN97 34.50
ME34 cutter 8 14NOV96 14.50
예제7 : 관측치 수정과 삭제 및 다른 SAS 데이터 세트에 관측치 추가하기
다음 예제는 관측치 수정과 삭제 및 다른 데이터 세트에 관측치 작성하는 작업을 보여준다. OUTPUT, REPLACE 와 REMOVE 구문이 사용되기 때문에 수행해야 할 작업을 정확하게 지정해야 한다.
1997년 이후에 받은 내용은 INVTY.STOCK97에 출력되고, INVTY.STOCK 데이터 세트에서 제거된다. 마찬가지로, 1995년에 받은 내용은 INVTY.STOCK95에 출력되고, INVTY.STOCK 데이터 세트에서 제거된다. 1996년에 받은 내용은 INVTY.STOCK 데이터 세트에 유지되고, PRICE 변수의 값을 수정한다.
SAS Program |
libname invty 'SAS-library';
data invty.stock invty.stock95 invty.stock97;
modify invty.stock;
if recdate>'01jan97'd then do;
output invty.stock97;
remove invty.stock;
end;
else if recdate<'01jan96'd then do;
output invty.stock95;
remove invty.stock;
end;
else do;
price=price*1.1;
replace invty.stock;
end;
run;
proc print data=invty.stock noobs;
title 'New Prices for Stock Received in 1996';
run;
[PROC PRINT 결과물 : invty.Stcok 데이터 세트]
Results |
New Prices for Stock Received in 1996 1
PARTNO DESC INSTOCK RECDATE PRICE
LK43 filter 121 19MAY96 12.089
MN21 brace 43 10AUG96 30.657
BC85 clamp 80 16AUG96 10.505
NCF3 valve 198 20MAR96 26.950
KJ66 cutter 6 18JUN96 21.747
UYN7 rod 211 09SEP96 12.705
[SAS Statement] SAS 데이터 스텝 구문 사전 목록] |
SAS 함수(SAS Function) 리스트 링크 |
'SAS > SAS 구문사전' 카테고리의 다른 글
[SAS Statement] OPTIONS 구문 (0) | 2022.02.04 |
---|---|
【SAS Statement】 Null 구문 (0) | 2022.02.04 |
【SAS Statement】 MISSING 구문 (0) | 2022.02.03 |
【SAS Statement】 MERGE 구문 (0) | 2022.02.03 |
[SAS Statement] LOSTCARD 구문 (0) | 2022.02.03 |
댓글