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

[데이터 추출] 비상관 서브쿼리(Uncorrelated Subqueyr) 를 만족하는 데이터 추출 - 비교 연산자(=) 과 Between 연산자 - 93

by 기서무나구물 2022. 9. 27.

포스팅 목차

     

    93. Display employee name, deptname, salary and comm. for those Sal in between 2000 to 5000 while location is Chicago.

     

    * 시카고에서 근무하고 급여가 2000에서 5000 사이에 위치한 직원의 정보를 출력하시오.


    • Oracle : 비상관 서브쿼리, between 연산자
    • 파이썬 Pandas : iloc[], between()
    • R 프로그래밍 : 비교 구문, subset()
    • R Dplyr Package : dplyr::filter(), pull(), between()
    • R sqldf Package : 비상관 서브쿼리, between 연산자
    • Python pandasql Package : 비상관 서브쿼리, between 연산자
    • R data.table Package : 비교 구문, %between%
    • SAS Proc SQL : 비상관 서브쿼리, between 연산자, Where 데이터 세트 옵션
    • SAS Data Step : Merge 구문, IF 조건문
    • Python Dfply Package : filter_by(), @pipe & Def 사용자 정의 함수, between()
    • 파이썬 Base 프로그래밍 :

     


    1. Oracle(오라클)

    서브쿼리로 dept 테이블에서 시카고에 위치한 부서의 부서 번호를 선택 후 emp 테이블에서 시카고에 위치한 부서에서 근무하는 직원들을 1차적으로 선택하고, 이 중에서 2000~5000 사이의 급여를 수령하는 직원의 정보를 출력하시오.

     

    Oracle Programming
    select empno,ename,deptno from emp 
    where  deptno = (select deptno from dept where loc='CHICAGO') 
      and  sal between 2000 and 5000;

     


    2. Python Pandas(파이썬)

    dept 테이블에서 부서 위치가 시카고에 위치한 부서의 부서 번호를 선택하여서 emp 테이블에서 dept 테이블에서 선택된 부서 번호에 해당하는 직원들을 선택하고, 이 중에서 2000~5000 사이의 급여를 수령하는 직원의 정보를 출력하시오.

     

    Python Programming
    emp[ (emp['deptno']== (dept[dept['loc'] == 'CHICAGO']['deptno'].iloc[0]) ) &
         ( emp['sal'].between(2000, 5000, inclusive = True) )][['empno', 'ename','deptno']]

     

     

    Results
    empno ename deptno
    7698 BLAKE 30

     


    3. R Programming (R Package)

    dept 테이블에서 부서 위치가 시카고에 위치한 부서의 부서 번호를 선택하여서 emp 테이블에서 dept 테이블에서 선택된 부서 번호에 해당하는 직원들을 선택하고, 이 중에서 2000~5000 사이의 급여를 수령하는 직원의 정보를 출력하시오.

     

    R Programming
    %%R
    
    emp[emp$deptno == dept[dept$loc == 'CHICAGO', c("deptno") ]$deptno & ( emp$sal > 2000 & emp$sal < 5000 ),c("empno","ename","deptno")]

     

     

    Results
    # A tibble: 1 x 3
      empno ename deptno
      <dbl> <chr>  <dbl>
    1  7698 BLAKE     30

     


     

    R Programming
    %%R
    subset(emp,subset= ( (deptno == subset(dept,subset=(loc =='CHICAGO'),select = c("deptno"))$deptno ) &
                         (sal > 2000 & sal < 5000))  , 
               select= c(empno,ename,deptno) )

     

     

    Results
    # A tibble: 1 x 3
      empno ename deptno
      <dbl> <chr>  <dbl>
    1  7698 BLAKE     30

     


    4. R Dplyr Package

    dept 테이블에서 부서 위치가 시카고에 위치한 부서의 부서 번호를 선택하여서 emp 테이블에서 dept 테이블에서 선택된 부서 번호에 해당하는 직원들을 선택하고, 이 중에서 2000~5000 사이의 급여를 수령하는 직원의 정보를 출력하시오.

     

    R Programming
    %%R
    
    emp %>% dplyr::filter( deptno == ( dept %>%
                                         dplyr::filter(loc == "CHICAGO") %>%
                                         dplyr::select(deptno) %>%
                                         pull(deptno)) 
                          & between(sal, 2000 , 5000) ) %>% 
      dplyr::select(empno,ename,deptno)

     

     

    Results
    # A tibble: 1 x 3
      empno ename deptno
      <dbl> <chr>  <dbl>
    1  7698 BLAKE     30

     


    5. R sqldf Package

    서브쿼리로 dept 테이블에서 시카고에 위치한 부서의 부서 번호를 선택 후 emp 테이블에서 시카고에 위치한 부서에서 근무하는 직원들을 1차적으로 선택하고, 이 중에서 2000~5000 사이의 급여를 수령하는 직원의 정보를 출력하시오.

     

    R Programming
    %%R
    
    sqldf("select empno,ename,deptno 
           from   emp 
           where  deptno=(select deptno from dept where loc='CHICAGO') 
             and  sal between 2000 and 5000;")

     

     

    Results
      empno ename deptno
    1  7698 BLAKE     30

     


    6. Python pandasql Package

    서브쿼리로 dept 테이블에서 시카고에 위치한 부서의 부서 번호를 선택 후 emp 테이블에서 시카고에 위치한 부서에서 근무하는 직원들을 1차적으로 선택하고, 이 중에서 2000~5000 사이의 급여를 수령하는 직원의 정보를 출력하시오.

    Python Programming
    ps.sqldf(" select empno,ename,deptno                                     \
               from   emp                                                    \
               where  deptno=(select deptno from dept where loc='CHICAGO')   \
                 and  sal between 2000 and 5000;")

     

     

    Results
    empno ename deptno
    7698 BLAKE 30

     


    7. R data.table Package

    dept 테이블에서 시카고에 위치한 부서 번호를 테이블로 선택 후 emp 테이블과 내부조인(DT syntax)을 수행하여서 시카고에 위치한 부서에서 근무하는 직원들을 1차적으로 선택하고, 이 중에서 2000~5000 사이의 급여를 수령하는 직원의 정보를 출력하시오.

     

    R Programming
    %%R
    
    DT          <- data.table(emp)
    dept_DT     <- data.table(dept)
    salgrade_DT <- data.table(salgrade)
    
    # setkey(DT, deptno)
    # setkey(dept_DT, deptno)
    
    DT[DT[, (deptno == ( dept_DT[loc == "CHICAGO", .(deptno)]$deptno )) & sal %between% list(2000,5000)], .(empno, ename,deptno)]

     

     

    Results
       empno ename deptno
    1:  7698 BLAKE     30

     


    8. SAS Proc SQL

    서브쿼리로 dept 테이블에서 시카고에 위치한 부서의 부서 번호를 선택 후 emp 테이블에서 시카고에 위치한 부서에서 근무하는 직원들을 1차적으로 선택하고, 이 중에서 2000~5000 사이의 급여를 수령하는 직원의 정보를 출력하시오.

    SAS Programming
    %%SAS sas
    
    PROC SQL;
      CREATE TABLE STATSAS_1 AS
        select empno,ename,deptno 
        from   emp 
        where  deptno=(select deptno from dept where loc='CHICAGO') 
          and  sal between 2000 and 5000;
    QUIT;
    PROC PRINT;RUN;

     

     

    Results
    empno ename deptno
    7698 BLAKE 30

     


    9. SAS Data Step

     

    SAS Programming
    %%SAS sas
    
    PROC SORT DATA=emp OUT=EMP_1;
         BY deptno;
    RUN;
    
    PROC SORT DATA=dept OUT=dept_2 NODUPKEY;
         BY deptno;
         where dname='SALES';
    RUN;
    
    * IF 구문에서는 between 지원 안함;
    DATA STATSAS_2;
     MERGE EMP_1(IN=A) dept_2(IN=B);
         BY deptno;
         IF A AND B and sal >= 2000 and sal <= 5000 THEN OUTPUT;
         keep empno ename deptno;
    RUN;
    PROC PRINT;RUN;

     

     

    Results
    empno ename deptno
    7698 BLAKE 30

     


     

    SAS Programming
    %%SAS sas
    
    PROC SORT DATA=emp OUT=EMP_1;
         BY deptno;
    RUN;
    
    PROC SORT DATA=dept OUT=dept_2 NODUPKEY;
         BY deptno;
         where dname='SALES';
    RUN;
    
    DATA STATSAS_3;
     MERGE EMP_1(IN=A where=(sal between 2000 and 5000)) dept_2(IN=B);
         BY deptno;
         IF A AND B THEN OUTPUT;
         keep empno ename deptno;
    RUN;
    PROC PRINT;RUN;

     

     

    Results
    empno ename deptno
    7698 BLAKE 30

     


    10. Python Dfply Package

     

    Python Programming
    # [참고] 함수 사용. (52번 예제 참고)
    @pipe
    def pull_fun(df, column=-1):
        return df.loc[:, column].item()
    
    emp >> filter_by ( X.deptno == ( dept >> filter_by(X['loc'] == "CHICAGO") >> select(X.deptno) >> pull_fun("deptno") ),
                       between(X.sal, 2000, 5000) ) >> \
      select(X.empno, X.ename)

     

     


    Results
    empno ename
    7698 BLAKE

     


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

     

     

     

    반응형

    댓글