본문 바로가기
SAS/SAS 구문사전

【SAS Statement】 MODIFY 구문

by 기서무나구물 2022. 2. 3.

포스팅 목차

    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

    댓글