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

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

by 기서무나구물 2023. 1. 4.

포스팅 목차

     

    152. Display those employees whose manger name is Jones and also with his manager name.

     

    * 관리자의 이름이 ‘JONES’인 직원들의 정보와 ‘JONES’를 관리하고 있는 관리자의 정보를 함께 출력하시오.


    • 파이썬 & R 패키지 호출 및 예제 데이터 생성 링크
    • 유사문제 : 51/52/85/89/92/93/102, 89/150
    • [데이터 추출] 특정 조건을 만족하는 데이터 추출 - 비상관 서브쿼리, 데이터 상하 결합(UNION)
    • 데이터 전처리 (SQL, Pandas, R Prog, Dplyr, Dfply, SQLDF, PANDASQL, DATA.TABLE, SAS, Proc Sql)
    • Oracle : 비상관 서브쿼리, UNION 데이터 상하 결합
    • 파이썬 Pandas : iloc[], OR('|') 연산자
    • R 프로그래밍 : %in%, OR('|') 연산자
    • R Dplyr Package : OR('|') 연산자, pull()
    • R sqldf Package : 비상관 서브쿼리, UNION ALL 데이터 상하 결합
    • Python pandasql Package : 비상관 서브쿼리, UNION ALL 데이터 상하 결합
    • R data.table Package : OR('|') 연산자
    • SAS Proc SQL : 비상관 서브쿼리, UNION 데이터 상하 결합
    • SAS Data Step : proc sort 의 nodupkey, Merge 구문, IF 조건문, SET 상하 결합 구문
    • Python Dfply Package : OR('|') 연산자, @dfpipe & def 사용자 정의 함수(pull_fun)
    • 파이썬 Base 프로그래밍 :

     


    1. Oracle(오라클)

    1차로 서브쿼리에서 ‘JONES’의 사원번호(‘empno’)를 선택 후 emp 테이블의 관리자 사원번호(‘mgr’)에서 검색하여 ‘JONES’가 관리자로 근무하고 있는 담당 부서의 직원들 정보를 출력한다.

    2차로 서브쿼리에서 ‘JONES’의 관리자 사원번호(‘mgr’)를 선택 후 emp 테이블의 사원번호(‘empno’)에서 검색하여 ‘JONES’를 관리하고 있는 담당 관리자의 정보를 출력한다.

    앞의 2개 결과를 UNION으로 상하결합하여 출력한다.

    Oracle Programming
    Select * from emp where mgr  =(select empno from emp where ename='JONES') 
    union 
    select * from emp where empno=(select mgr   from emp where ename='JONES');

     


    2. Python Pandas(파이썬)

    emp테이블의 관리자 사원번호(‘mgr’)에서 ‘JONES’의 사원번호를 선택하여서 ‘JONES’가 관리자로 근무하고 있는 담당 부서의 직원 정보 또는 emp 테이블의 사원번호(‘empno’)에서 ‘JONES’를 담당하고 있는 관리자 사원번호를 검색하여 ‘JONES’의 담당 관리자의 직원 정보를 함께 출력한다.

    Python Programming
    emp[ (emp['mgr']== (emp[emp['ename'] == 'JONES']['empno'].iloc[0]) ) | (emp['empno']== (emp[emp['ename'] == 'JONES']['mgr'].iloc[0]) ) ]

     


    Results
      empno ename job mgr hiredate sal comm deptno
    7 7788 SCOTT ANALYST 7566.0 1982/12/09 3000 NaN 20
    8 7839 KING PRESIDENT NaN 1981/11/17 5000 NaN 10
    12 7902 FORD ANALYST 7566.0 1981/12/03 3000 NaN 20

     


    3. R Programming (R Package)

    emp테이블의 관리자 사원번호(‘mgr’)에서 ‘JONES’의 사원번호를 선택하여서 ‘JONES’가 관리자로 근무하고 있는 담당 부서의 직원이거나, emp 테이블의 사원번호(‘empno’)에서 ‘JONES’를 담당하고 있는 관리자 사원번호를 검색하여 ‘JONES’의 담당 관리자에 해당하는 경우에 정보를 출력한다.

    R Programming
    %%R
    
    emp[ (emp$mgr %in% emp[emp$ename == 'JONES', c("empno") ]$empno) | (emp$empno %in% emp[emp$ename == 'JONES', c("mgr") ]$mgr), ]

     

    Results
    # A tibble: 3 x 8
      empno ename job         mgr hiredate     sal  comm deptno
      <dbl> <chr> <chr>     <dbl> <date>     <dbl> <dbl>  <dbl>
    1  7788 SCOTT ANALYST    7566 1982-12-09  3000    NA     20
    2  7839 KING  PRESIDENT    NA 1981-11-17  5000    NA     10
    3  7902 FORD  ANALYST    7566 1981-12-03  3000    NA     20

     


    4. R Dplyr Package

    emp테이블의 관리자 사원번호(‘mgr’)에서 ‘JONES’의 사원번호를 선택하여서 ‘JONES’가 관리자로 근무하고 있는 담당 부서의 직원이거나, emp 테이블의 사원번호(‘empno’)에서 ‘JONES’를 담당하고 있는 관리자 사원번호를 검색하여 ‘JONES’의 담당 관리자에 해당하는 경우에 정보를 출력한다.

    R Programming
    %%R
    
    emp %>% dplyr::filter( (mgr == ( emp %>%
                                         dplyr::filter(ename == "JONES") %>%
                                         dplyr::select(empno) %>%
                                         pull(empno)) )
                            | 
                            (empno == ( emp %>%
                                         dplyr::filter(ename == "JONES") %>%
                                         dplyr::select(mgr) %>%
                                         pull(mgr)) )
                         )

     

    Results
    # A tibble: 3 x 8
      empno ename job         mgr hiredate     sal  comm deptno
      <dbl> <chr> <chr>     <dbl> <date>     <dbl> <dbl>  <dbl>
    1  7788 SCOTT ANALYST    7566 1982-12-09  3000    NA     20
    2  7839 KING  PRESIDENT    NA 1981-11-17  5000    NA     10
    3  7902 FORD  ANALYST    7566 1981-12-03  3000    NA     20

     


    5. R sqldf Package

    1차로 서브쿼리에서 ‘JONES’의 사원번호(‘empno’)를 선택 후 emp 테이블의 관리자 사원번호(‘mgr’)에서 검색하여 ‘JONES’가 관리자로 근무하고 있는 담당 부서의 직원들 정보를 출력한다.

    2차로 서브쿼리에서 ‘JONES’의 관리자 사원번호(‘mgr’)를 선택 후 emp 테이블의 사원번호(‘empno’)에서 검색하여 ‘JONES’를 관리하고 있는 담당 관리자의 정보를 출력한다.

    앞의 2개 결과를 UNION ALL 연산자로 상하결합하여 출력한다.

    R Programming
    %%R
    
    sqldf(" select e.* from emp e,emp e1 where e.mgr=e1.empno and e1.ename='JONES'
            union all
            select e1.* from emp e,emp e1 where e.mgr=e1.empno and e.ename='JONES';")
      empno ename       job  mgr   hiredate  sal comm deptno
    1  7788 SCOTT   ANALYST 7566 1982-12-09 3000   NA     20
    2  7902  FORD   ANALYST 7566 1981-12-03 3000   NA     20
    3  7839  KING PRESIDENT   NA 1981-11-17 5000   NA     10

     


    6. Python pandasql Package

    Python Programming
    ps.sqldf(" Select * from emp where mgr=(select empno from emp where ename='JONES')    \
               union all                                                                  \
               select * from emp where empno=(select mgr from emp where ename='JONES');")

     


    Results
      empno ename job mgr hiredate sal comm deptno
    0 7788 SCOTT ANALYST 7566.0 1982/12/09 3000 None 20
    1 7902 FORD ANALYST 7566.0 1981/12/03 3000 None 20
    2 7839 KING PRESIDENT NaN 1981/11/17 5000 None 10

     


    7. R data.table Package

    emp테이블의 관리자 사원번호(‘mgr’)에서 ‘JONES’의 사원번호를 선택하여서 ‘JONES’가 관리자로 근무하고 있는 담당 부서의 직원이거나, emp 테이블의 사원번호(‘empno’)에서 ‘JONES’를 담당하고 있는 관리자 사원번호를 검색하여 ‘JONES’의 담당 관리자에 해당하는 경우에 정보를 출력한다.

    R Programming
    %%R
    
    DT          <- data.table(emp)
    
    # setkey(DT, deptno)
    # setkey(dept_DT, deptno)
    
    DT[ (DT[,mgr == ( DT[ename == "JONES", .(empno)]$empno )]) | (DT[,empno == ( DT[ename == "JONES", .(mgr)]$mgr )]) , ]

     

    Results
       empno ename       job  mgr   hiredate  sal comm deptno
    1:  7788 SCOTT   ANALYST 7566 1982-12-09 3000   NA     20
    2:  7839  KING PRESIDENT   NA 1981-11-17 5000   NA     10
    3:  7902  FORD   ANALYST 7566 1981-12-03 3000   NA     20

     


    8. SAS Proc SQL

    SAS Programming
    %%SAS sas
    
    PROC SQL;
      CREATE TABLE STATSAS_1 AS
        Select * from emp where mgr  =(select empno from emp where ename='JONES') 
        union 
        select * from emp where empno=(select mgr   from emp where ename='JONES');
    QUIT;
    PROC PRINT;RUN;

     


    Results
    OBS empno ename job mgr hiredate sal comm deptno
    1 7788 SCOTT ANALYST 7566 1982-12-09 3000 . 20
    2 7839 KING PRESIDEN . 1981-11-17 5000 . 10
    3 7902 FORD ANALYST 7566 1981-12-03 3000 . 20

     


    9. SAS Data Step

    SAS Programming
    %%SAS sas
    
    proc sort data=emp out=emp_1(rename=mgr=join_key);
         by mgr;
    run;
    
    proc sort data=emp out=emp_2(rename=empno=join_key keep=empno) nodupkey;
         by empno;
         where ename='JONES';
    run;
    
    DATA STATSAS_2;
     merge emp_1(in=a) emp_2(in=b);
         by join_key;
         if a and b;
    RUN;
    
    proc sort data=emp out=emp_3(rename=empno=join_key);
         by empno;
    run;
    
    proc sort data=emp out=emp_4(rename=mgr=join_key keep=mgr) nodupkey;
         by mgr;
         where ename='JONES';
    run;
    
    DATA STATSAS_3;
     merge emp_3(in=a) emp_4(in=b);
         by join_key;
         if a and b;
    RUN;
    
    data STATSAS_4;
     set STATSAS_2(rename=join_key=mgr)
         STATSAS_3(rename=join_key=empno);
    run;
    
    PROC PRINT;RUN;

     


    Results
    OBS empno ename job mgr hiredate sal comm deptno
    1 7788 SCOTT ANALYST 7566 1982-12-09 3000 . 20
    2 7902 FORD ANALYST 7566 1981-12-03 3000 . 20
    3 7839 KING PRESIDEN . 1981-11-17 5000 . 10

     


    10. Python Dfply Package

     

    Python Programming
    emp >> \
      filter_by( ( ( X.mgr   == ( emp >>
                                    filter_by(X.ename=="JONES") >>
                                    select(X.empno) >>
                                    pull_fun("empno")) )
                   |
                   ( X.empno == ( emp >>
                                   filter_by(X.ename=="JONES") >>
                                   select(X.mgr) >>
                                   pull_fun("mgr")) )
                 ) )

     


    Results
      empno ename job mgr hiredate sal comm deptno
    7 7788 SCOTT ANALYST 7566.0 1982/12/09 3000 NaN 20
    8 7839 KING PRESIDENT NaN 1981/11/17 5000 NaN 10
    12 7902 FORD ANALYST 7566.0 1981/12/03 3000 NaN 20

     


     

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

    반응형

    댓글