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

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

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

포스팅 목차

    118. Display those manager who are not working under president but they are working under any other manager?

     

    * 직속 상사가 사장이 아닌 일반 관리자 밑에서 근무하는 직원의 정보를 출력하시오.


    • Oracle : 비상관 서브쿼리, IN 연산자
    • 파이썬 Pandas : isin()
    • R 프로그래밍 : %in%, unlist()
    • R Dplyr Package : %in%
    • R sqldf Package : 비상관 서브쿼리, IN 연산자
    • Python pandasql Package : 비상관 서브쿼리, IN 연산자
    • R data.table Package : %in%, unlist()
    • SAS Proc SQL : 비상관 서브쿼리, IN 연산자
    • SAS Data Step : CROSS JOIN (카테시안 곱) 구현
    • Python Dfply Package : @pipe & def 사용자 정의 함수(pull_list), isin()
    • 파이썬 Base 프로그래밍 :

     


    1. Oracle(오라클)

    서브쿼리를 사용하여서 담당 관라지가 사장(‘KING’) 이외의 일반 관리자인 직원 정보를 출력한다.

    Oracle Programming
    select * 
    from   emp e 
    where  mgr in (select empno from emp where ename<>'KING');

     


    2. Python Pandas(파이썬)

    isin 함수를 사용하여서 관리자 사원번호에서 사장(‘KING’) 이외의 사원번호를 선택하여서 일반 직속 상사와 근무하는 직원 정보를 출력한다.

    Python Programming
    emp[emp['mgr'].isin(emp[emp['ename'] != 'KING']['empno']) ].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
    4 7654 MARTIN SALESMAN 7698.0 1981/09/28 1250 1400.0 30
    7 7788 SCOTT ANALYST 7566.0 1982/12/09 3000 NaN 20

     


    3. R Programming (R Package)

    %in% 함수를 사용하여서 관리자 사원번호에서 사장(‘KING’) 이외의 사원번호를 선택하여서 일반 직속 상사와 근무하는 직원 정보를 출력한다.

    R Programming
    %%R
    
    emp[emp$mgr %in% unlist(emp[emp$ename != 'KING', "empno" ]),] %>% 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  7654 MARTIN SALESMAN  7698 1981-09-28  1250  1400     30
    5  7788 SCOTT  ANALYST   7566 1982-12-09  3000    NA     20
    6  7844 TURNER SALESMAN  7698 1981-09-08  1500     0     30

     


    4. R Dplyr Package

    %in% 함수를 사용하여서 관리자 사원번호가 사장(‘KING’) 이외의 사원번호에 존재하는 직원들을 선택하여서 일반 직속 상사와 근무하고 있는 직원 정보를 출력한다.

    R Programming
    %%R
    
    emp %>%
      dplyr::filter( mgr %in% ( emp  %>% dplyr::filter( ename != 'KING' ) %>% dplyr::select(empno) %>% 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  7654 MARTIN SALESMAN  7698 1981-09-28  1250  1400     30
    5  7788 SCOTT  ANALYST   7566 1982-12-09  3000    NA     20
    6  7844 TURNER SALESMAN  7698 1981-09-08  1500     0     30

     


    5. R sqldf Package

    서브쿼리를 사용하여서 담당 관라지가 사장(‘KING’) 이외의 일반 관리자인 직원 정보를 출력한다.

     

    R Programming
    %%R
    
    sqldf("select * from emp e where mgr in(select empno from emp where ename<>'KING');") %>% 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  7654 MARTIN SALESMAN 7698 1981-09-28 1250 1400     30
    5  7788  SCOTT  ANALYST 7566 1982-12-09 3000   NA     20
    6  7844 TURNER SALESMAN 7698 1981-09-08 1500    0     30

     


    6. Python pandasql Package

    서브쿼리를 사용하여서 담당 관라지가 사장(‘KING’) 이외의 일반 관리자인 직원 정보를 출력한다.

     

    Python Programming
    ps.sqldf("select * from emp e where mgr in(select empno from emp where ename<>'KING');").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 7654 MARTIN SALESMAN 7698.0 1981/09/28 1250 1400.0 30
    4 7788 SCOTT ANALYST 7566.0 1982/12/09 3000 NaN 20

     


    7. R data.table Package

    %in% 함수를 사용하여서 관리자 사원번호가 사장(‘KING’) 이외의 사원번호에 존재하는 직원들을 선택하여서 일반 직속 상사와 근무하고 있는 직원 정보를 출력한다.

     

    R Programming
    %%R
    DT <- data.table(emp)
    dept_DT <- data.table(dept)
    
    DT[DT[,mgr %in% unlist(DT[ename != 'KING', .(empno)])]][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:  7654 MARTIN SALESMAN 7698 1981-09-28 1250 1400     30
    5:  7788  SCOTT  ANALYST 7566 1982-12-09 3000   NA     20

     


    8. SAS Proc SQL

    서브쿼리를 사용하여서 담당 관라지가 사장(‘KING’) 이외의 일반 관리자인 직원 정보를 출력한다.

     

    SAS Programming
    %%SAS sas
    
    PROC SQL;
      CREATE TABLE STATSAS_1 AS
        select * 
        from   emp e 
        where  mgr in (select empno from emp where ename ne 'KING');
    QUIT;
    PROC SORT;BY EMPNO;RUN;
    PROC PRINT;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 7654 MARTIN SALESMAN 7698 1981-09-28 1250 1400 30
    5 7788 SCOTT ANALYST 7566 1982-12-09 3000 . 20
    6 7844 TURNER SALESMAN 7698 1981-09-08 1500 0 30
    7 7876 ADAMS CLERK 7788 1983-01-12 1100 . 20
    8 7900 JAMES CLERK 7698 1981-12-03 950 . 30
    9 7902 FORD ANALYST 7566 1981-12-03 3000 . 20
    10 7934 MILLER CLERK 7782 1982-01-23 1300 . 10

     


    9. SAS Data Step

    • DATA STEP(CROSS JOIN-카테시안 곱);

     

    SAS Programming
    %%SAS sas
    
    DATA STATSAS_2; 
     SET emp(where=(ename ne 'KING') rename=(empno=mgr_empno) keep=ename empno);
         DO I=1 TO KOBS; 
            SET EMP NOBS=KOBS POINT=I;
            IF MGR = MGR_EMPNO THEN OUTPUT;
         END;    
    RUN;
    PROC SORT;BY EMPNO;RUN;
    PROC PRINT;RUN;

     

    Results
    OBS mgr_empno ename empno job mgr hiredate sal comm deptno
    1 7902 SMITH 7369 CLERK 7902 1980-12-17 800 . 20
    2 7698 ALLEN 7499 SALESMAN 7698 1981-02-20 1600 300 30
    3 7698 WARD 7521 SALESMAN 7698 1981-02-22 1250 500 30
    4 7698 MARTIN 7654 SALESMAN 7698 1981-09-28 1250 1400 30
    5 7566 SCOTT 7788 ANALYST 7566 1982-12-09 3000 . 20
    6 7698 TURNER 7844 SALESMAN 7698 1981-09-08 1500 0 30
    7 7788 ADAMS 7876 CLERK 7788 1983-01-12 1100 . 20
    8 7698 JAMES 7900 CLERK 7698 1981-12-03 950 . 30
    9 7566 FORD 7902 ANALYST 7566 1981-12-03 3000 . 20
    10 7782 MILLER 7934 CLERK 7782 1982-01-23 1300 . 10

     


    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.mgr.isin( emp >> filter_by(X.ename != 'KING') >> select(X.empno) >> pull_list("empno")  )) >> \
      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
    4 7654 MARTIN SALESMAN 7698.0 1981/09/28 1250 1400.0 30
    7 7788 SCOTT ANALYST 7566.0 1982/12/09 3000 NaN 20

     


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

    반응형

    댓글