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

[비상관 서브쿼리(In)] 특정 조건을 만족하는 데이터 추출 - 131 (오라클 SQL, R, Python, SAS)

by 기서무나구물 2022. 12. 18.

포스팅 목차

     

    131. Display those employees who are working in sales or research?

     

    * 영업부서(‘SALES’) 또는 연구부서(‘RESEARCH’)에서 근무하고 있는 직원들의 정보를 출력하시오.

     


    • Oracle : 비상관 서브쿼리, in 연산자
    • 파이썬 Pandas : isin()
    • R 프로그래밍 : %in%, unlist()
    • R Dplyr Package : %in%, unlist()
    • R sqldf Package : 비상관 서브쿼리, in 연산자
    • Python pandasql Package : 비상관 서브쿼리, in 연산자
    • R data.table Package : %in%, unlist()
    • SAS Proc SQL : 비상관 서브쿼리, in 연산자
    • SAS Data Step : Merge 구문, IF 조건문
    • Python Dfply Package : @pipe & def 사용자 정의 함수(pull_list), isin(),filter_by()
    • 파이썬 Base 프로그래밍 :

     


    1. Oracle(오라클)

    서브쿼리를 사용하여서 부서정보테이블(DEPT)에서 영업부서와 연구부서에 해당하는 부서 코드(‘deptno’)를 선택 후 직원정보테이블(EMP)에서 해당 부서코드에서 근무하고 있는 직원들의 정보를 출력한다.

     

    Oracle Programming
    select * 
    from   emp 
    where  deptno in ( select deptno from dept where dname in ('SALES','RESEARCH') );

     


    2. Python Pandas(파이썬)

    부서정보테이블(DEPT)에서 영업부서와 연구부서에 해당하는 부서코드(‘deptno’)를 선택 후 isin() 함수를 사용하여서 직원정보테이블(EMP)에서 해당 부서코드(20,30)에서 근무하고 있는 직원들의 정보를 출력한다.

     

    Python Programming
    print(dept[dept['dname'].isin(['SALES','RESEARCH'])]['deptno'])
    
    emp[emp['deptno'].isin(dept[dept['dname'].isin(['SALES','RESEARCH'])]['deptno'])].head()

     

    Results
    1    20
    2    30
    Name: deptno, dtype: int64

     

    Results
      empno ename job mgr hiredate sal comm deptno
    0 7369 SMITH CLERK 7902.0 1980/12/17 800 NaN 20
    1 7499 ALLEN SALESMAN 7698.0 1981/02/20 1600 300.0 30
    2 7521 WARD SALESMAN 7698.0 1981/02/22 1250 500.0 30
    3 7566 JONES MANAGER 7839.0 1981/04/02 2975 NaN 20
    4 7654 MARTIN SALESMAN 7698.0 1981/09/28 1250 1400.0 30

     


    3. R Programming (R Package)

    부서정보테이블(DEPT)에서 영업부서와 연구부서에 해당하는 부서코드(‘deptno’)를 선택 후 %in% 함수를 사용하여서 직원정보테이블(EMP)에서 해당 부서코드(20,30)에서 근무하고 있는 직원들의 정보를 출력한다.

     

    R Programming
    %%R
    
    # print( unlist( dept[ dept$dname %in% c('SALES','RESEARCH') , 'deptno' ] ) )
    
    emp [ emp$deptno %in% unlist( dept[ dept$dname %in% c('SALES','RESEARCH') , 'deptno' ] ) , ] %>% head()

     

    Results
    # A tibble: 11 x 8
       empno ename  job        mgr hiredate     sal  comm deptno
       <dbl> <chr>  <chr>    <dbl> <date>     <dbl> <dbl>  <dbl>
     1  7369 SMITH  CLERK     7902 1980-12-17   800    NA     20
     2  7499 ALLEN  SALESMAN  7698 1981-02-20  1600   300     30
     3  7521 WARD   SALESMAN  7698 1981-02-22  1250   500     30
     4  7566 JONES  MANAGER   7839 1981-04-02  2975    NA     20
     5  7654 MARTIN SALESMAN  7698 1981-09-28  1250  1400     30
     6  7698 BLAKE  MANAGER   7839 1981-03-01  2850    NA     30
     7  7788 SCOTT  ANALYST   7566 1982-12-09  3000    NA     20
     8  7844 TURNER SALESMAN  7698 1981-09-08  1500     0     30
     9  7876 ADAMS  CLERK     7788 1983-01-12  1100    NA     20
    10  7900 JAMES  CLERK     7698 1981-12-03   950    NA     30
    11  7902 FORD   ANALYST   7566 1981-12-03  3000    NA     20

     


    4. R Dplyr Package

    부서정보테이블(DEPT)에서 영업부서와 연구부서에 해당하는 부서코드(‘deptno’)를 선택 후 dplyr::filter() 함수를 사용하여서 직원정보테이블(EMP)에서 해당 부서코드(20,30)에서 근무하고 있는 직원들의 정보를 출력한다.

     

    R Programming
    %%R
    
    # unlist(dept %>% dplyr::filter(dname %in% c('SALES','RESEARCH' )) %>% dplyr::select(deptno))
    
    emp %>% 
      dplyr::filter( deptno %in% ( dept %>% dplyr::filter(dname %in% c('SALES','RESEARCH' )) %>% 
                                            dplyr::select(deptno) %>% unlist() )) %>%
      head()

     

    Results
    # A tibble: 6 x 8
      empno ename  job        mgr hiredate     sal  comm deptno
      <dbl> <chr>  <chr>    <dbl> <date>     <dbl> <dbl>  <dbl>
    1  7369 SMITH  CLERK     7902 1980-12-17   800    NA     20
    2  7499 ALLEN  SALESMAN  7698 1981-02-20  1600   300     30
    3  7521 WARD   SALESMAN  7698 1981-02-22  1250   500     30
    4  7566 JONES  MANAGER   7839 1981-04-02  2975    NA     20
    5  7654 MARTIN SALESMAN  7698 1981-09-28  1250  1400     30
    6  7698 BLAKE  MANAGER   7839 1981-03-01  2850    NA     30

     


    5. R sqldf Package

    서브쿼리를 사용하여서 부서정보테이블(DEPT)에서 영업부서와 연구부서에 해당하는 부서코드(‘deptno’)를 선택 후 직원정보테이블(EMP)에서 해당 부서코드에서 근무하고 있는 직원들의 정보를 출력한다.

     

    R Programming
    %%R
    
    sqldf(" select * 
            from   emp 
            where  deptno in (select deptno from dept where dname in('SALES','RESEARCH'));") %>% head()

     

    Results
      empno  ename      job  mgr   hiredate  sal comm deptno
    1  7369  SMITH    CLERK 7902 1980-12-17  800   NA     20
    2  7499  ALLEN SALESMAN 7698 1981-02-20 1600  300     30
    3  7521   WARD SALESMAN 7698 1981-02-22 1250  500     30
    4  7566  JONES  MANAGER 7839 1981-04-02 2975   NA     20
    5  7654 MARTIN SALESMAN 7698 1981-09-28 1250 1400     30
    6  7698  BLAKE  MANAGER 7839 1981-03-01 2850   NA     30

     


    6. Python pandasql Package

    서브쿼리를 사용하여서 부서정보테이블(DEPT)에서 영업부서와 연구부서에 해당하는 부서코드(‘deptno’)를 선택 후 직원정보테이블(EMP)에서 해당 부서코드에서 근무하고 있는 직원들의 정보를 출력한다.

     

    Python Programming
    ps.sqldf(" select * from emp           \
               where  deptno in (select deptno from dept where dname in('SALES','RESEARCH'));").head()

     

    Results
      empno ename job mgr hiredate sal comm deptno
    0 7369 SMITH CLERK 7902.0 1980/12/17 800 NaN 20
    1 7499 ALLEN SALESMAN 7698.0 1981/02/20 1600 300.0 30
    2 7521 WARD SALESMAN 7698.0 1981/02/22 1250 500.0 30
    3 7566 JONES MANAGER 7839.0 1981/04/02 2975 NaN 20
    4 7654 MARTIN SALESMAN 7698.0 1981/09/28 1250 1400.0 30

     


    7. R data.table Package

    부서정보테이블(DEPT)에서 영업부서와 연구부서에 해당하는 부서코드(‘deptno’)를 선택 후 %in% 함수를 사용하여서 직원정보테이블(EMP)에서 해당 부서코드(20,30)에서 근무하고 있는 직원들의 정보를 출력한다.

     

    R Programming
    %%R
    
    DT          <- data.table(emp)
    dept_DT     <- data.table(dept)
    
    # dept_DT[dname %in% c("SALES", "RESEARCH"), .(deptno)]
    
    DT[ deptno %in% unlist(dept_DT[dname %in% c("SALES", "RESEARCH"), .(deptno)]) ][1:5, ]

     

    Results
       empno  ename      job  mgr   hiredate  sal comm deptno
    1:  7369  SMITH    CLERK 7902 1980-12-17  800   NA     20
    2:  7499  ALLEN SALESMAN 7698 1981-02-20 1600  300     30
    3:  7521   WARD SALESMAN 7698 1981-02-22 1250  500     30
    4:  7566  JONES  MANAGER 7839 1981-04-02 2975   NA     20
    5:  7654 MARTIN SALESMAN 7698 1981-09-28 1250 1400     30

     


    8. SAS Proc SQL

    서브쿼리를 사용하여서 부서정보테이블(DEPT)에서 영업부서와 연구부서에 해당하는 부서코드(‘deptno’)를 선택 후 직원정보테이블(EMP)에서 해당 부서코드에서 근무하고 있는 직원들의 정보를 출력한다.

     

    SAS Programming
    %%SAS sas
    
    PROC SQL;
      CREATE TABLE STATSAS_1 AS
        select * 
        from   emp 
        where  deptno in ( select deptno from dept where dname in ('SALES','RESEARCH') );
    QUIT;
    PROC PRINT data=STATSAS_1(obs=5);RUN;

     

    Results
    OBS empno ename job mgr hiredate sal comm deptno
    1 7369 SMITH CLERK 7902 1980-12-17 800 . 20
    2 7499 ALLEN SALESMAN 7698 1981-02-20 1600 300 30
    3 7521 WARD SALESMAN 7698 1981-02-22 1250 500 30
    4 7566 JONES MANAGER 7839 1981-04-02 2975 . 20
    5 7654 MARTIN SALESMAN 7698 1981-09-28 1250 1400 30

     


    9. SAS Data Step

     

    SAS Programming
    %%SAS sas
    
    PROC SORT DATA=EMP OUT=EMP_1;
         BY deptno;
    RUN;
    
    DATA STATSAS_3; 
     MERGE EMP_1(IN=A) dept(where=(dname in ('SALES','RESEARCH')) IN=B);
         BY deptno;
         IF A AND B;
    RUN;
    
    PROC PRINT data=STATSAS_1(obs=5);RUN;

     

    Results
    OBS empno ename job mgr hiredate sal comm deptno
    1 7369 SMITH CLERK 7902 1980-12-17 800 . 20
    2 7499 ALLEN SALESMAN 7698 1981-02-20 1600 300 30
    3 7521 WARD SALESMAN 7698 1981-02-22 1250 500 30
    4 7566 JONES MANAGER 7839 1981-04-02 2975 . 20
    5 7654 MARTIN SALESMAN 7698 1981-09-28 1250 1400 30

     


    10. Python Dfply Package

     

    Python Programming
    # [참고] 함수 사용. (52번 예제 참고) : AttributeError: 'DataFrame' object has no attribute 'ix'
    @pipe
    def pull_list(df, column=-1):
        return df.loc[:, column]
    
    emp >> \
      filter_by ( X.deptno.isin( dept >> filter_by(X.dname.isin(['SALES','RESEARCH'])) >> select(X.deptno) >> pull_list("deptno") ) ) >> \
      head()

     


    Results
      empno ename job mgr hiredate sal comm deptno
    0 7369 SMITH CLERK 7902.0 1980/12/17 800 NaN 20
    1 7499 ALLEN SALESMAN 7698.0 1981/02/20 1600 300.0 30
    2 7521 WARD SALESMAN 7698.0 1981/02/22 1250 500.0 30
    3 7566 JONES MANAGER 7839.0 1981/04/02 2975 NaN 20
    4 7654 MARTIN SALESMAN 7698.0 1981/09/28 1250 1400.0 30

     


     

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

    반응형

    댓글