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

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

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

포스팅 목차

     

    128. Display those employees whose deptno is available in salary?

     

    * [문제 변경] 사원번호(empno)가 관리자 사원번호(mgr) 에 존재하는 사원을 선택하시오.


    • Oracle : 비상관 서브쿼리, In 연산자, Disitnct 연산자
    • 파이썬 Pandas : isin(), list(), unique()
    • R 프로그래밍 : %in%, unlist(), unique()
    • R Dplyr Package : %in%, unlist(), unique()
    • R sqldf Package : 비상관 서브쿼리, In 연산자, Disitnct 연산자
    • Python pandasql Package : 비상관 서브쿼리, In 연산자, Disitnct 연산자
    • R data.table Package : %in%, unlist(), unique()
    • SAS Proc SQL : 비상관 서브쿼리, In 연산자, Disitnct 연산자
    • SAS Data Step : PROC SUMMARY, CROSS JOIN (카테시안 곱) 구현, IF 조건문
    • Python Dfply Package : isin()
    • 파이썬 Base 프로그래밍 :

     


    1. Oracle(오라클)

    서브쿼리를 사용하여서 사원번호가 관리자 사원번호에 존재하는 직원들을 선택하여 관리자 역할을 수행하는 직원들의 정보를 출력한다.

    Oracle Programming
    select ename,sal 
    from   emp 
    where  empno in (select distinct mgr from emp);

     


    2. Python Pandas(파이썬)

    사원번호(‘empno’) 를 emp테이블의 관리자(‘mgr’) 사원번호를 조회하여서 관리자(‘mgr’) 역할을 수행하는 직원들의 정보를 출력한다.

     

    Python Programming
    emp[ emp['empno'].isin(emp['mgr'])]

     


    Results
      empno ename job mgr hiredate sal comm deptno
    3 7566 JONES MANAGER 7839.0 1981/04/02 2975 NaN 20
    5 7698 BLAKE MANAGER 7839.0 1981/03/01 2850 NaN 30
    6 7782 CLARK MANAGER 7839.0 1981/01/09 2450 NaN 10
    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

     


    좀 더 명확하게 unique로 중복 제거한 사원번호를 조회 할 수 있다.

     

    Python Programming
    emp[ emp['empno'].isin( list(emp['mgr'].unique()) )]

     


    Results
      empno ename job mgr hiredate sal comm deptno
    3 7566 JONES MANAGER 7839.0 1981/04/02 2975 NaN 20
    5 7698 BLAKE MANAGER 7839.0 1981/03/01 2850 NaN 30
    6 7782 CLARK MANAGER 7839.0 1981/01/09 2450 NaN 10
    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)

    사원번호(‘empno’) 를 대상으로 emp테이블의 관리자(‘mgr’) 사원번호를 조회하여서 관리자(‘mgr’) 역할을 수행하는 직원들의 정보를 출력한다.

     

    R Programming
    %%R
    
    emp[emp$empno %in% unlist(unique(emp$mgr)), ]

     

    Results
    # A tibble: 6 x 8
      empno ename job         mgr hiredate     sal  comm deptno
      <dbl> <chr> <chr>     <dbl> <date>     <dbl> <dbl>  <dbl>
    1  7566 JONES MANAGER    7839 1981-04-02  2975    NA     20
    2  7698 BLAKE MANAGER    7839 1981-03-01  2850    NA     30
    3  7782 CLARK MANAGER    7839 1981-01-09  2450    NA     10
    4  7788 SCOTT ANALYST    7566 1982-12-09  3000    NA     20
    5  7839 KING  PRESIDENT    NA 1981-11-17  5000    NA     10
    6  7902 FORD  ANALYST    7566 1981-12-03  3000    NA     20

     


    4. R Dplyr Package

    사원번호(empno)가 관리자 사원번호(mgr)에 존재하는 직원들을 선택하여 관리자 역할을 수행하는 직원들의 정보를 출력한다.

     

    R Programming
    %%R
    
    emp %>% filter( empno %in% unlist(unique(mgr) ))

     

    Results
    # A tibble: 6 x 8
      empno ename job         mgr hiredate     sal  comm deptno
      <dbl> <chr> <chr>     <dbl> <date>     <dbl> <dbl>  <dbl>
    1  7566 JONES MANAGER    7839 1981-04-02  2975    NA     20
    2  7698 BLAKE MANAGER    7839 1981-03-01  2850    NA     30
    3  7782 CLARK MANAGER    7839 1981-01-09  2450    NA     10
    4  7788 SCOTT ANALYST    7566 1982-12-09  3000    NA     20
    5  7839 KING  PRESIDENT    NA 1981-11-17  5000    NA     10
    6  7902 FORD  ANALYST    7566 1981-12-03  3000    NA     20

     


    5. R sqldf Package

    서브쿼리를 사용하여서 사원번호가 관리자 사원번호에 존재하는 직원들을 선택하여 관리자 역할을 수행하는 직원들의 정보를 출력한다.

     

    R Programming
    %%R
    
    sqldf(" select ename,sal 
            from   emp 
            where  empno in (select distinct mgr from emp);")

     

    Results
      ename  sal
    1 JONES 2975
    2 BLAKE 2850
    3 CLARK 2450
    4 SCOTT 3000
    5  KING 5000
    6  FORD 3000

     


    6. Python pandasql Package

    서브쿼리를 사용하여서 사원번호가 관리자 사원번호에 존재하는 직원들을 선택하여 관리자 역할을 수행하는 직원들의 정보를 출력한다.

     

    Python Programming
    ps.sqldf(" select ename,sal from emp where empno in (select distinct mgr from emp); ")

     

    Results
      ename sal
    0 JONES 2975
    1 BLAKE 2850
    2 CLARK 2450
    3 SCOTT 3000
    4 KING 5000
    5 FORD 3000

     


    7. R data.table Package

    emp테이블에서 관리자(‘mgr’) 사원번호를 조회하여서 관리자(‘mgr’) 역할을 수행하는 직원을 선택한다.

     

    R Programming
    %%R
    DT          <- data.table(emp)
    
    DT[ empno %in% unlist(unique(DT[, .(mgr)])), ]

     

    Results
       empno ename       job  mgr   hiredate  sal comm deptno
    1:  7566 JONES   MANAGER 7839 1981-04-02 2975   NA     20
    2:  7698 BLAKE   MANAGER 7839 1981-03-01 2850   NA     30
    3:  7782 CLARK   MANAGER 7839 1981-01-09 2450   NA     10
    4:  7788 SCOTT   ANALYST 7566 1982-12-09 3000   NA     20
    5:  7839  KING PRESIDENT   NA 1981-11-17 5000   NA     10
    6:  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 ename,sal,job
        from   emp 
        where  empno in (select distinct mgr from emp);;
    QUIT;
    PROC PRINT;RUN;

     


    Results
    OBS ename sal job
    1 JONES 2975 MANAGER
    2 BLAKE 2850 MANAGER
    3 CLARK 2450 MANAGER
    4 SCOTT 3000 ANALYST
    5 KING 5000 PRESIDEN
    6 FORD 3000 ANALYST

     


    9. SAS Data Step

    • DATA STEP(CROSS JOIN-카테시안 곱);
    SAS Programming
    %%SAS sas
    
    PROC SUMMARY DATA=EMP NWAY;
         CLASS MGR;
         VAR   EMPNO;
         OUTPUT OUT=MGR_CNT(DROP=_: RENAME=MGR=MGR_EMPNO) N=;
    RUN;
    
    DATA STATSAS_3; 
     SET MGR_CNT; 
         DO I=1 TO KOBS; 
            SET EMP NOBS=KOBS POINT=I;
            IF EMPNO = MGR_EMPNO THEN OUTPUT;
         END;    
    RUN;
    
    PROC PRINT;RUN;

     


    Results
    OBS MGR_EMPNO empno ename job mgr hiredate sal comm deptno
    1 7566 7566 JONES MANAGER 7839 1981-04-02 2975 . 20
    2 7698 7698 BLAKE MANAGER 7839 1981-03-01 2850 . 30
    3 7782 7782 CLARK MANAGER 7839 1981-01-09 2450 . 10
    4 7788 7788 SCOTT ANALYST 7566 1982-12-09 3000 . 20
    5 7839 7839 KING PRESIDEN . 1981-11-17 5000 . 10
    6 7902 7902 FORD ANALYST 7566 1981-12-03 3000 . 20

     


    10. Python Dfply Package

     

    Python Programming
    emp >> filter_by( X.empno.isin(X.mgr))

     


    Results
      empno ename job mgr hiredate sal comm deptno
    3 7566 JONES MANAGER 7839.0 1981/04/02 2975 NaN 20
    5 7698 BLAKE MANAGER 7839.0 1981/03/01 2850 NaN 30
    6 7782 CLARK MANAGER 7839.0 1981/01/09 2450 NaN 10
    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 예제로 만나는 테이블 데이터 전처리 방법 리스트

    반응형

    댓글