BookmarkSubscribeRSS Feed

오라클 메타 정보를 활용한 변수 class 별 건수 통계량 산출

Started ‎06-15-2020 by
Modified ‎06-15-2020 by
Views 182

오라클 Meta 테이블에서 변수 칼럼(성별) 통계 정보는 제공을 하고 있으나 해당 변수의 Class(남/녀) 통계 정보를 제공을 해주지 않아서 별도로 산출 프로그램 구현. (Class 값이 150개 이하)

 

* 오라클 DB 라이브러리 생성;

libname REAL1 oracle user="DB접속ID" password="DB접속패스워드" path="DB path" ADJUST_BYTE_SEMANTIC_COLUMN_LENGTHS=NO DBCLIENT_MAX_BYTES=1 INSERTBUFF=150000;

 

* 오라클 메타 테이블 ALL_TAB_COLUMNS을 사용하여서 해당 칼람의 class 개수가 150개 이하에 대하여 통계량 산출;

* 컬럼별 class 개수는 "NUM_DISTINCT" 이 값을 사용:

* 통계량 : 개별 컬럼의 class 별 건수;

 

 

* 첫 번째 작업에서는 산출 값에 따라 기준 테이블(target_table)을 생성;

* 이후 반복문에서 INSER INTO작업으로 통계량 적재;

DATA target_table;

     LENGTH TABLE_NAME $128.

            COLUMN_NAME $128.

            COLUMN_ID   $3.

            COL_CLASS   $128.

            CNT         8.;

     STOP;

RUN;

 

* 작업 테이블 지정;

data _null_;

   set REAL1.ALL_TAB_COLUMNS(where=( OWNER = 'APCOM' AND 

                                     TABLE_NAME IN ('CUPT0000TB','CUPT0100TB') AND 

                                     NUM_DISTINCT BETWEEN 0 AND 150)) end=last;

   

   /* if _n_ eq 1 then  */

   call execute('PROC SQL;

                      CREATE TABLE INSERT_DATA AS

                   select '||'"'||TABLE_NAME||'"  AS TABLE_NAME,'

                           ||'"'||COLUMN_NAME||'" AS COLUMN_NAME, '

                           ||'"'||COMPRESS(PUT(COLUMN_ID,$3.))||'"   AS COLUMN_ID,'

                                ||compress(COLUMN_NAME)||'  AS COL_CLASS,

                           COUNT(*) AS CNT 

                   from '||cats('REAL1','.',TABLE_NAME)||' GROUP BY '||COLUMN_NAME||' ;

                 '|| '

 

                 DATA INSERT_DATA_1(RENAME=(COLUMN_ID_1=COLUMN_ID COL_CLASS_1 = COL_CLASS));

                  SET INSERT_DATA;

                      LENGTH COLUMN_ID_1 $3.

                             COL_CLASS_1 $128.;

                      COLUMN_ID_1 = COMPRESS(COLUMN_ID);

                      COL_CLASS_1 = COMPRESS(COL_CLASS);

                      DROP COLUMN_ID COL_CLASS;

                 RUN;

 

                 PROC SQL;

                 insert into target_table

                   select TABLE_NAME,

                          COLUMN_NAME,

                          COLUMN_ID,

                          COL_CLASS,

                          CNT

                   from INSERT_DATA_1 ;

               ');

run;

QUIT;

 

 

* 원본 오라클 메타데이터에 left join;

* 원본 컬럼 정보에 위 산출된 통계량 join;

 

PROC SQL;

  CREATE TABLE WORK.TABLE_STAT AS

    SELECT A.OWNER,

           A.TABLE_NAME,

           A.COLUMN_NAME,

           A.DATA_TYPE,

           A.COLUMN_ID,

           A.NUM_DISTINCT,

           B.COL_CLASS,

           B.CNT

    FROM   REAL1.ALL_TAB_COLUMNS A

           LEFT JOIN target_table B

                ON   A.TABLE_NAME  = B.TABLE_NAME

                AND  A.COLUMN_NAME = B.COLUMN_NAME

    where  A.OWNER = 'APCOM' 

      AND  A.TABLE_NAME IN ('CUPT0000TB','CUPT0100TB')  /* 테이블 명*/

    ORDER BY 

           A.TABLE_NAME,

           A.COLUMN_ID,

           B.COL_CLASS;

QUIT; 

 

* 출처 : 기서무나구물 (http://statwith.com/sas-tip-%ec%98%a4%eb%9d%bc%ed%81%b4-%eb%a9%94%ed%83%80-%ec%a0%95%eb%b3%b4%eb%a5%...)

Version history
Last update:
‎06-15-2020 04:46 AM
Updated by:
Contributors

sas-innovate-wordmark-2025-midnight.png

Register Today!

Join us for SAS Innovate 2025, our biggest and most exciting global event of the year, in Orlando, FL, from May 6-9. Sign up by March 14 for just $795.


Register now!

Article Labels
Article Tags