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

[데이터 추출] 내부조인(Inner join)을 만족하는 데이터 추출 - 101

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

포스팅 목차

     

    101. Display those employees whose manager names is Jones, and also display there manager name.

     

    * 관리자 이름이 ‘Jones’인 직원 이름과 관리자(‘Jones’)의 이름을 출력하시오.


    • Oracle : 내부결합
    • 파이썬 Pandas : pd.merge()
    • R 프로그래밍 : merge()
    • R Dplyr Package : dplyr::inner_join()
    • R sqldf Package : 내부결합
    • Python pandasql Package : 내부결합
    • R data.table Package : DT syntax 방식 데이터 결합
    • SAS Proc SQL : 내부결합
    • SAS Data Step : Merge 구문, IF 조건문
    • Python Dfply Package : @pipe & Def 사용자 정의 함수(inner_join_merge)
    • 파이썬 Base 프로그래밍 :

     


    1. Oracle(오라클)

    emp 테이블을 관리자(‘mgr’) 사원번호와 사원번호(‘empno’)를 기준으로 self join(셀프조인, 자체조인, 자체결합) 하여서 해당 관리자의 이름이 ‘Jones’인 사원을 선택한다.

     

    Oracle Programming
    select e.empno, e.ename, m.ename MANAGER 
    from   emp e, emp m 
    where  e.mgr   = m.empno 
      and  m.ename = 'JONES';

     


    2. Python Pandas(파이썬)

    emp 테이블의 사원번호(‘empno’)와 emp 테이블에서 직원 이름이 ‘JONES’인 직원을 선택 후 이 테이블의 관리자(‘mgr’) 사원번호와 내부결합(Inner Join)하여서 해당 관리자의 이름이 ‘Jones’인 사원을 선택한다.

     

    Python Programming
    pd.merge(emp, emp[emp['ename']=='JONES'], how='inner', left_on=['mgr'], right_on=['empno'])[['empno_x',"ename_x","ename_y"]]

     


    Results
    empno_x ename_x ename_y
    7788 SCOTT JONES
    7902 FORD JONES

     


    3. R Programming (R Package)

    emp 테이블의 사원번호(‘empno’)와 emp 테이블에서 직원 이름이 ‘JONES’인 직원을 선택 후 이 테이블의 관리자(‘mgr’) 사원번호와 내부결합(Inner Join)하여서 해당 관리자의 이름이 ‘Jones’인 사원을 선택한다.

     

    R Programming
    %%R
    
    merge(emp ,emp[emp$ename == 'JONES',  ] , by.x=c("mgr"),
                                              by.y=c("empno"),all.x=F)[,c("empno","ename.x","ename.y")]

     

    Results
      empno ename.x ename.y
    1  7788   SCOTT   JONES
    2  7902    FORD   JONES

     


    4. R Dplyr Package

    emp 테이블의 사원번호(‘empno’)와 emp 테이블에서 직원 이름이 ‘JONES’인 직원을 선택 후 이 테이블의 관리자(‘mgr’) 사원번호를 기준으로 내부결합(Inner_Join)수행하여서 해당 관리자의 이름이 ‘Jones’인 사원을 선택한다.

     

    R Programming
    %%R
    
    emp %>%
      dplyr::inner_join( ( emp %>% filter(ename == 'JONES') ), by = c('mgr' = "empno")) %>%
      dplyr::select(empno,ename.x,ename.y)

     

    Results
    # A tibble: 2 x 3
      empno ename.x ename.y
      <dbl> <chr>   <chr>  
    1  7788 SCOTT   JONES  
    2  7902 FORD    JONES  

     


    5. R sqldf Package

    emp 테이블을 관리자(‘mgr’) 사원번호와 사원번호(‘empno’)를 기준으로 self join 하여서 해당 관리자의 이름이 ‘Jones’인 사원을 선택한다.

     

    R Programming
    %%R
    
    sqldf("select e.empno, e.ename, m.ename MANAGER
           from   emp e, emp m
           where  e.mgr   = m.empno 
             and  m.ename = 'JONES';")

     

    Results
      empno ename MANAGER
    1  7788 SCOTT   JONES
    2  7902  FORD   JONES

     


    6. Python pandasql Package

    emp 테이블을 관리자(‘mgr’) 사원번호와 사원번호(‘empno’)를 기준으로 self join(셀프조인, 자체조인, 자체결합) 하여서 해당 관리자의 이름이 ‘Jones’인 사원을 선택한다.

     

    Python Programming
    ps.sqldf("select e.empno, e.ename, m.ename MANAGER from emp e, emp m \
              where e.mgr=m.empno and m.ename='JONES';")

     


    Results
    empno ename MANAGER
    7788 SCOTT JONES
    7902 FORD JONES

     


    7. R data.table Package

    emp 테이블에서 직원 이름이 ‘JONES’인 직원을 선택 후 이 테이블의 관리자(‘mgr’) 사원번호와 emp 테이블의 사원번호(‘empno’)를 기준으로 내부결합(Inner Join)을 수행하여서 해당 관리자의 이름이 ‘Jones’인 사원을 선택한다.

     

    R Programming
    %%R
    
    DT <- data.table(emp)
    dept_DT <- data.table(dept)
    
    DT[DT[ename=='JONES',], nomatch=NULL, on = .( mgr=empno ), .(empno,ename,i.ename)]

     

    Results
       empno ename i.ename
    1:  7788 SCOTT   JONES
    2:  7902  FORD   JONES

     


    emp 테이블의 관리자(‘mgr’) 사원번호와 emp 테이블의 사원번호(‘empno’)를 기준으로 self join을 수행하고, 해당 관리자의 이름이 ‘Jones’인 사원을 선택한다.

     

    R Programming
    %%R
    
    DT[DT, nomatch=NULL, on = .( mgr=empno ), .(empno,ename,i.ename)][i.ename=='JONES',]

     

    Results
       empno ename i.ename
    1:  7788 SCOTT   JONES
    2:  7902  FORD   JONES

     


    8. SAS Proc SQL

    emp 테이블을 관리자(‘mgr’) 사원번호와 사원번호(‘empno’)를 기준으로 self join(셀프조인, 자체조인, 자체결합) 하여서 해당 관리자의 이름이 ‘Jones’인 사원을 선택한다.

     

    SAS Programming
    %%SAS sas
    
    PROC SQL;
      CREATE TABLE STATSAS_1 AS
        select e.empno, e.ename, m.ename as MANAGER 
        from   emp e, emp m 
        where  e.mgr   = m.empno 
          and  m.ename = 'JONES';
    QUIT;
    PROC PRINT;RUN;

     


    Results
    empno ename MANAGER
    7788 SCOTT JONES
    7902 FORD JONES

     


    9. SAS Data Step

     

    SAS Programming
    %%SAS sas
    
    PROC SORT DATA=emp OUT=EMP_1(RENAME=( mgr = MGR_EMPNO ) );
         BY mgr;
    RUN;
    
    PROC SORT DATA=emp OUT=EMP_2(RENAME=( empno = MGR_EMPNO ename = mrg_ename )
                                  KEEP=empno ename) NODUPKEY;
         BY empno;
    RUN;
    
    DATA STATSAS_2;
     MERGE EMP_1(IN=A) EMP_2(IN=B);
         BY MGR_EMPNO;
         IF A AND B;
         IF mrg_ename = 'JONES' THEN OUTPUT;
    RUN;
    PROC PRINT;RUN;

     


    Results
    empno ename job MGR_EMPNO hiredate sal comm deptno mrg_ename
    7788 SCOTT ANALYST 7566 1982-12-09 3000 . 20 JONES
    7902 FORD ANALYST 7566 1981-12-03 3000 . 20 JONES

     


    10. Python Dfply Package

    • inner_join : 56번/94번 참고
    Python Programming
    @pipe
    def inner_join_merge(df, other, left_on,right_on,suffixes=['_x','_y']):
    
        joined = df.merge(other, how='inner', left_on=left_on,
                          right_on=right_on , suffixes=suffixes)
        return joined
    
    emp >> \
      inner_join_merge( ( emp >> filter_by(X.ename=='JONES') ), left_on  = ["mgr"], right_on = ["empno"] ) >> \
      select(X.empno_x,X.ename_x, X.ename_y)

     


    Results
    empno_x ename_x ename_y
    7788 SCOTT JONES
    7902 FORD JONES

     


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

     

    반응형

    댓글