본문 바로가기
통계프로그램 비교 시리즈/프로그래밍비교(Oracle,Python,R,SAS)

[데이터 전처리 비교- 데이터 추출] 비상관 서브쿼리를 만족하는 데이터 추출 & 부등호 연산 - 85

by 기서무나구물 2022. 6. 13.

포스팅 목차

     

    85. Display the details of employees who are in sales dept and grade is 3.

     

    * 영업부서(Salses - ‘30’)에 근무하는 직원 중에서 판매 급여 등급이 3등급인 직원의 정보를 출력하시오.


    • Oracle : 비상관 서브쿼리(Uncorrelated Subqueyr), 부등호연산
    • 파이썬 Pandas : tolist(), 부등호 연산
    • R 프로그래밍 : 
    • R Dplyr 
    • R sqldf : 비상관 서브쿼리(Uncorrelated Subqueyr), Not in
    • Python pandasql : 비상관 서브쿼리(Uncorrelated Subqueyr), Not in
    • R data.table 
    • SAS Proc SQL : 
    • SAS Data Step : 
    • Python Dfply 
    • 파이썬 Base 프로그래밍 :

     


    1. Oracle(오라클)

    emp 테이블의 급여(‘sal’)에 대하여 판매급여(‘SALGRADE’) 테이블을 조회하여서 판매 등급이 3등급에 해당하는 직원을 선택하고, 이 직원들의 부서번호(‘deptno’)를 부서 정보(‘DEPT’) 테이블에서 조회하여서 부서이름(‘dname’)이 영업부서(‘SALSE’)에 해당하는 부서코드(‘30’)에 근무하는 직원의 정보를 선택한다.

     

    Oracle Programming
    select * 
    from   emp  
    where  sal    >= (select losal  from salgrade where grade=3) 
      and  sal    <= (select hisal  from salgrade where grade=3) 
      and  deptno  = (select deptno from dept where dname='SALES');

     


    2. Python Pandas(파이썬)

    • 판매급여(‘SALGRADE’) 테이블에서 판매 등급(‘grade’) 3등급의 하한값을 조회한다.

     

    Python Programming
    print( type(salgrade[salgrade['grade']==3]['losal'].tolist()[0]) )
    salgrade[salgrade['grade']==3]['losal'].tolist()[0]

     

    Results
    <class 'int'>
    
    1401

     


     

    Python Programming
    print( type(salgrade[salgrade['grade']==3][['losal']].iloc[0,0]) )
    
    type(salgrade[salgrade['grade']==3][['losal']].iloc[0,0])

     

    Results
    <class 'numpy.int64'>
    
    numpy.int64

     


    emp 테이블의 급여(‘sal’)에 대하여 판매급여(‘SALGRADE’) 테이블을 조회하여서 판매 등급이 3등급에 해당하는 직원을 선택하고, 이 직원들의 부서번호(‘deptno’)를 부서 정보(‘DEPT’) 테이블에서 조회하여서 부서이름(‘dname’)이 영업부서(‘SALSE’)에 해당하는 부서코드(‘30’)에 근무하는 직원의 정보를 선택한다.

     

    Python Programming
    emp[ ( emp['sal']    >= (salgrade[salgrade['grade']==3]['losal'].tolist()[0]) ) & 
         ( emp['sal']    <= (salgrade[salgrade['grade']==3][['hisal']].iloc[0,0]) ) & 
         ( emp['deptno'] == (dept[dept['dname']=='SALES'][['deptno']].iloc[0,0]) ) ]

     

    Results
      empno ename job mgr hiredate sal comm deptno
    1 7499 ALLEN SALESMAN 7698.0 1981/02/20 1600 300.0 30
    9 7844 TURNER SALESMAN 7698.0 1981/09/08 1500 0.0 30

     


    3. R Programming (R Package)

    emp 테이블의 급여(‘sal’)에 대하여 판매급여(‘SALGRADE’) 테이블을 조회하여서 판매 등급이 3등급에 해당하는 직원을 선택하고, 이 직원들의 부서번호(‘deptno’)를 부서 정보(‘DEPT’) 테이블에서 조회하여서 부서이름(‘dname’)이 영업부서(‘SALSE’)에 해당하는 부서코드(‘30’)에 근무하는 직원의 정보를 선택한다.

     

    R Programming
    %%R
    
    emp[ (emp$sal    >= unlist(salgrade[salgrade$grade == 3, "losal" ])) &
         (emp$sal    <= unlist(salgrade[salgrade$grade == 3, "hisal" ])) &
         (emp$deptno == unlist(dept[dept$dname =='SALES', "deptno" ]))
        ,]

     

    Results
    # A tibble: 2 x 8
      empno ename  job        mgr hiredate     sal  comm deptno
      <dbl> <chr>  <chr>    <dbl> <date>     <dbl> <dbl>  <dbl>
    1  7499 ALLEN  SALESMAN  7698 1981-02-20  1600   300     30
    2  7844 TURNER SALESMAN  7698 1981-09-08  1500     0     30

     


    4. R Dplyr Package

    emp 테이블의 급여(‘sal’)에 대하여 판매급여(‘SALGRADE’) 테이블을 조회하여서 판매 등급이 3등급에 해당하는 직원을 선택하고, 이 직원들의 부서번호(‘deptno’)를 부서 정보(‘DEPT’) 테이블에서 조회하여서 부서이름(‘dname’)이 영업부서(‘SALES’)에 해당하는 부서코드(‘30’)에 근무하는 직원의 정보를 선택한다.

    • 1차 : 급여(‘sal’)가 판매급여(‘SALGRADE’) 테이블에서 판매 등급(‘grade’) 3등급의 하한값과 상한값에 포함되는 직원을 선택
    • 2차 : 부서번호(‘deptno’)가 부서정보(‘DEPT’) 테이블에서 영업부서(‘SALES’)를 선택

     

    R Programming
    %%R
    
    emp %>%
      dplyr::filter( sal    >= ( salgrade  %>% dplyr::filter( grade == 3 )       %>% dplyr::select(losal)  %>% unlist() ) &
                     sal    <= ( salgrade  %>% dplyr::filter( grade == 3 )       %>% dplyr::select(hisal)  %>% unlist() ) &
                     deptno == ( dept      %>% dplyr::filter( dname == 'SALES' ) %>% dplyr::select(deptno) %>% unlist() ) 
                   )

     

    Results
    # A tibble: 2 x 8
      empno ename  job        mgr hiredate     sal  comm deptno
      <dbl> <chr>  <chr>    <dbl> <date>     <dbl> <dbl>  <dbl>
    1  7499 ALLEN  SALESMAN  7698 1981-02-20  1600   300     30
    2  7844 TURNER SALESMAN  7698 1981-09-08  1500     0     30

     


    5. R sqldf Package

    emp 테이블의 급여(‘sal’)에 대하여 판매급여(‘SALGRADE’) 테이블을 조회하여서 판매 등급이 3등급에 해당하는 직원을 선택하고, 이 직원들의 부서번호(‘deptno’)를 부서 정보(‘DEPT’) 테이블에서 조회하여서 부서이름(‘dname’)이 영업부서(‘SALSE’)에 해당하는 부서코드(‘30’)에 근무하는 직원의 정보를 선택한다.

     

    R Programming
    %%R
    
    sqldf("select * 
           from emp  
           where sal   >=(select losal  from salgrade where grade=3) 
             and sal   <=(select hisal  from salgrade where grade=3) 
             and deptno =(select deptno from dept     where dname='SALES');")

     

    Results
      empno  ename      job  mgr   hiredate  sal comm deptno
    1  7499  ALLEN SALESMAN 7698 1981-02-20 1600  300     30
    2  7844 TURNER SALESMAN 7698 1981-09-08 1500    0     30

     


    6. Python pandasql Package

    emp 테이블의 급여(‘sal’)에 대하여 판매급여(‘SALGRADE’) 테이블을 조회하여서 판매 등급이 3등급에 해당하는 직원을 선택하고, 이 직원들의 부서번호(‘deptno’)를 부서 정보(‘DEPT’) 테이블에서 조회하여서 부서이름(‘dname’)이 영업부서(‘SALSE’)에 해당하는 부서코드(‘30’)에 근무하는 직원의 정보를 선택한다.

     

    Python Programming
    ps.sqldf("select *                                                  \
              from emp                                                  \
              where sal   >=(select losal  from salgrade where grade=3) \
                and sal   <=(select hisal  from salgrade where grade=3) \
                and deptno =(select deptno from dept     where dname='SALES'); ")

     

    Results
      empno ename job mgr hiredate sal comm deptno
    0 7499 ALLEN SALESMAN 7698.0 1981/02/20 1600 300.0 30
    1 7844 TURNER SALESMAN 7698.0 1981/09/08 1500 0.0 30

     


    7. R data.table Package

    emp 테이블의 급여(‘sal’)에 대하여 판매급여(‘SALGRADE’) 테이블을 조회하여서 판매 등급이 3등급에 해당하는 직원을 선택하고, 이 직원들의 부서번호(‘deptno’)를 부서 정보(‘DEPT’) 테이블에서 조회하여서 부서이름(‘dname’)이 영업부서(‘SALSE’)에 해당하는 부서코드(‘30’)에 근무하는 직원의 정보를 선택한다.

     

    R Programming
    %%R
    DT          <- data.table(emp)
    dept_DT     <- data.table(dept)
    salgrade_DT <- data.table(salgrade)
    
    DT[ (sal   >= salgrade_DT[grade==3, losal ]) & 
        (sal   <= salgrade_DT[grade==3, hisal ]) &
        (deptno = dept_DT[dname=='SALES', deptno ])   , ]

     

    Results
       empno  ename      job  mgr   hiredate  sal comm deptno
    1:  7499  ALLEN SALESMAN 7698 1981-02-20 1600  300     30
    2:  7844 TURNER SALESMAN 7698 1981-09-08 1500    0     30

     


    8. SAS Proc SQL

    emp 테이블의 급여(‘sal’)에 대하여 판매급여(‘SALGRADE’) 테이블을 조회하여서 판매 등급이 3등급에 해당하는 직원을 선택하고, 이 직원들의 부서번호(‘deptno’)를 부서 정보(‘DEPT’) 테이블에서 조회하여서 부서이름(‘dname’)이 영업부서(‘SALSE’)에 해당하는 부서코드(‘30’)에 근무하는 직원의 정보를 선택한다.

     

    SAS Programming
    %%SAS sas
    
    PROC SQL;
      CREATE TABLE STATSAS_1 AS
        select * 
        from   emp  
        where  sal    >= (select losal  from salgrade where grade=3) 
          and  sal    <= (select hisal  from salgrade where grade=3) 
          and  deptno  = (select deptno from dept where dname='SALES');
    QUIT;
    PROC PRINT;RUN;

     

    Results
    OBS empno ename job mgr hiredate sal comm deptno
    1 7499 ALLEN SALESMAN 7698 1981-02-20 1600 300 30
    2 7844 TURNER SALESMAN 7698 1981-09-08 1500 0 30

     


    9. SAS Data Step

    • SALGRADE와 DEPT에서 반환되는 값이 1건이어서 아래와 같이 처리;

     

    SAS Programming
    %%SAS sas
    
    DATA STATSAS_2; 
     SET salgrade( keep=losal  grade where=(grade=3)); 
     SET salgrade( keep=hisal  grade where=(grade=3));
     SET dept    ( keep=deptno dname where=(dname='SALES') rename=deptno=dept_no);
         DO I=1 TO KOBS; 
            SET emp NOBS=KOBS POINT=I;
            IF SAL >= LOSAL AND SAL <= HISAL AND DEPTNO = DEPT_NO THEN output;
         END;
         DROP DEPT_NO;
    RUN;
    PROC PRINT;RUN;

     

    Results
    OBS grade losal hisal dname empno ename job mgr hiredate sal comm deptno
    1 3 1401 2000 SALES 7499 ALLEN SALESMAN 7698 1981-02-20 1600 300 30
    2 3 1401 2000 SALES 7844 TURNER SALESMAN 7698 1981-09-08 1500 0 30

     


    • Macro 할당 방식
    SAS Programming
    %%SAS sas
    
    proc sql noprint;
      select losal, hisal into :losal, :hisal
      from   salgrade
      where  grade=3;
    quit;
    
    proc sql noprint;
      select deptno into :deptno
      from   dept
      where  dname='SALES';
    quit;
    
    %put TNote:  losal  = &losal;
    %put TNote:  hisal  = &hisal;
    %put TNote:  deptno = &deptno;
    
    DATA STATSAS_3;
     SET emp;
         IF SAL >= &losal AND SAL <= &hisal AND DEPTNO = &deptno THEN OUTPUT;
    RUN;
    PROC PRINT;RUN;

     

    Results
    OBS empno ename job mgr hiredate sal comm deptno
    1 7499 ALLEN SALESMAN 7698 1981-02-20 1600 300 30
    2 7844 TURNER SALESMAN 7698 1981-09-08 1500 0 30

     


    • Data step의 Macro 변수 할당 방식
    SAS Programming
    %%SAS sas
    
    DATA _NULL_;
     SET salgrade;
         CALL SYMPUT('losal_M',losal);
         CALL SYMPUT('hisal_M',hisal);
         WHERE grade=3;
    RUN;
    
    DATA _NULL_;
     SET dept;
         CALL SYMPUT('deptno_M',deptno);
         WHERE dname='SALES';
    RUN;
    
    
    %put TNote:  losal  = &losal_M;
    %put TNote:  hisal  = &hisal_M;
    %put TNote:  hisal  = &deptno_M;
    
    DATA STATSAS_3;
     SET emp;
         IF SAL >= &losal_M AND SAL <= &hisal_M AND DEPTNO = &deptno_M THEN OUTPUT;
    RUN;
    PROC PRINT;RUN;

     

    Results
    OBS empno ename job mgr hiredate sal comm deptno
    1 7499 ALLEN SALESMAN 7698 1981-02-20 1600 300 30
    2 7844 TURNER SALESMAN 7698 1981-09-08 1500 0 30

     


    10. Python Dfply Package

     

    Python Programming
    # [참고] 함수 사용. (52번 예제 참고)
    @pipe
    def pull_fun(df, column=-1):
        return df.loc[:, column].item()
    
    emp >> filter_by( X.sal    >= ( salgrade >> filter_by(X.grade == 3) >> select(X.losal) >> pull_fun("losal") ) ,
                      X.sal    <= ( salgrade >> filter_by(X.grade == 3) >> select(X.hisal) >> pull_fun("hisal") ) , 
                      X.deptno == ( dept >> filter_by(X.dname=='SALES') >> select(X.deptno) >> pull_fun("deptno") )
                    )

     

    Results
      empno ename job mgr hiredate sal comm deptno
    1 7499 ALLEN SALESMAN 7698.0 1981/02/20 1600 300.0 30
    9 7844 TURNER SALESMAN 7698.0 1981/09/08 1500 0.0 30

     



     

    [SQL, Pandas, R Prog, Dplyr, SQLDF, PANDASQL, DATA.TABLE]   SQL EMP 예제로 만나는 테이블 데이터 처리 방법 리스트

    반응형

    댓글