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

[데이터 필터링 - 비상관 서브쿼리(Uncorrelated Subqueyr) 를 만족하는 데이터 추출 - 비교연산자] 테이블 데이터 전처리 비교 - 58

by 기서무나구물 2021. 8. 20.

포스팅 목차

    58. Display the employee names who are working in accountings dept

     

    * 회계부서에서 근무하고 있는 직원들의 이름을 출력하시오.


    • Oracle : 비상관 서브쿼리, in 연산자
    • 파이썬 Pandas : isin()
    • R 프로그래밍 : %in%
    • R Dplyr Package : filter(), %in%
    • R sqldf Package : 비상관 서브쿼리, in 연산자
    • Python pandasql Package : 비상관 서브쿼리, in 연산자
    • R data.table Package : %in%
    • SAS Proc SQL : 비상관 서브쿼리, in 연산자
    • SAS Data Step : 내부조인(Inner join), IF 조건문
    • Python Dfply Package : filter_by(), pipe (사용자정의 함수) - pull_fun
    • 파이썬 Base 프로그래밍 :

     


    1. Oracle(오라클)

    서브쿼리로 dept 테이블에서 회계부서("ACCOUNTING")의 부서 번호를 선택 후 emp 테이블에서 회계부서에서 근무하는 직원의 정보를 출력한다.

    Oracle Programming
    select  * 
    from    emp 
    where   deptno = (select deptno from dept where dname='ACCOUNTING');

     


    • IN 구문과 비상관 서브쿼리
    Oracle Programming
    select * 
    from   emp 
    where  deptno in (select deptno from dept where dname='ACCOUNTING')

     


    2. Python Pandas(파이썬)

    • dept 테이블에서 회계 부서(dname = "ACCOUNTING")의 부서 코드("deptno")를 검색 후 emp 테이블에서 회계 부서('10')에서 근무하는 직원의 정보를 출력한다.
    • isin 함수를 사용하여서 emp 테이블의 부서번호(deptno)가 dept 테이블에서 선택된 부서코드에 존재하는지 검색한다.
    Python Programming
    emp[emp['deptno'].isin(dept[dept['dname'] == 'ACCOUNTING']['deptno']) ]

     

    Results
      empno ename job mgr hiredate sal comm deptno
    6 7782 CLARK MANAGER 7839.0 1981/01/09 2450 NaN 10
    8 7839 KING PRESIDENT NaN 1981/11/17 5000 NaN 10
    13 7934 MILLER CLERK 7782.0 1982/01/23 1300 NaN 10

     


     

    Python Programming
    emp[emp['deptno'].isin(dept.query('dname == "ACCOUNTING"')["deptno"]) ]

     

    Results
      empno ename job mgr hiredate sal comm deptno
    6 7782 CLARK MANAGER 7839.0 1981/01/09 2450 NaN 10
    8 7839 KING PRESIDENT NaN 1981/11/17 5000 NaN 10
    13 7934 MILLER CLERK 7782.0 1982/01/23 1300 NaN 10

     


    3. R Programming (R Package)

    • dept 테이블에서 회계 부서(dname = "ACCOUNTING")의 부서 코드("deptno")를 검색 후 emp 테이블에서 회계 부서('10')에서 근무하는 직원의 정보를 출력한다.
    • %in% 함수를 사용하여서 emp 테이블의 부서번호(deptno)가 dept 테이블에서 선택된 부서코드에 존재하는지 검색한다.
    R Programming
    %%R
    
    emp[emp$deptno %in% dept[dept$dname == 'ACCOUNTING', c("deptno") ],"ename"]

     

    Results
    # A tibble: 3 x 1
      ename 
      <chr> 
    1 CLARK 
    2 KING  
    3 MILLER

     


    4. R Dplyr Package

    • dept 테이블에서 회계 부서(dname = "ACCOUNTING")의 부서 코드("deptno")를 검색 후 emp 테이블에서 회계 부서('10')에서 근무하는 직원의 정보를 출력한다.
    • filter 함수를 사용하여서 emp 테이블의 부서번호(deptno)가 dept 테이블에서 선택된 부서코드에 존재하는지 검색한다.
    R Programming
    %%R
    
    emp %>% dplyr::filter( deptno %in% ( dept %>% dplyr::filter(dname == "ACCOUNTING") %>%
                                                  dplyr::select(deptno) ) )

     

    Results
    # A tibble: 3 x 8
      empno ename  job         mgr hiredate     sal  comm deptno
      <dbl> <chr>  <chr>     <dbl> <date>     <dbl> <dbl>  <dbl>
    1  7782 CLARK  MANAGER    7839 1981-01-09  2450    NA     10
    2  7839 KING   PRESIDENT    NA 1981-11-17  5000    NA     10
    3  7934 MILLER CLERK      7782 1982-01-23  1300    NA     10

     


    5. R sqldf Package

    서브쿼리로 dept 테이블에서 회계부서("ACCOUNTING")의 부서 번호를 선택 후 emp 테이블에서 회계부서에서 근무하는 직원의 정보를 출력한다.

    R Programming
    %%R
    sqldf("select  ename from emp 
           where deptno = (select deptno from dept where dname='ACCOUNTING');")

     

    Results
       ename
    1  CLARK
    2   KING
    3 MILLER

     


    • IN 구문과 비상관 서브쿼리
    R Programming
    %%R
    sqldf(" select ename from emp 
            where deptno in (select deptno from dept where dname='ACCOUNTING')")

     

    Results
       ename
    1  CLARK
    2   KING
    3 MILLER

     


    6. Python pandasql Package

    • 비상관 서브쿼리
    Python Programming
    ps.sqldf(" select  ename from emp \
               where deptno = (select deptno from dept where dname='ACCOUNTING')")

     

    Results
      ename
    0 CLARK
    1 KING
    2 MILLER

     


    • IN 구문과 비상관 서브쿼리
    Python Programming
    ps.sqldf(" select ename from emp \
               where deptno in (select deptno from dept where dname='ACCOUNTING')")

     

    Results
      ename
    0 CLARK
    1 KING
    2 MILLER

     


    7. R data.table Package

    • 데이터 추출(Subset)
    R Programming
    %%R
    DT      <- data.table(emp)
    dept_DT <- data.table(dept)
    
    DT[ deptno %in% dept_DT[dname == "ACCOUNTING", .(deptno)]]

     

    Results
       empno  ename       job  mgr   hiredate  sal comm deptno
    1:  7782  CLARK   MANAGER 7839 1981-01-09 2450   NA     10
    2:  7839   KING PRESIDENT   NA 1981-11-17 5000   NA     10
    3:  7934 MILLER     CLERK 7782 1982-01-23 1300   NA     10

     


    dept 테이블에서 회계부서("ACCOUNTING")의 부서 번호를 테이블로 선택 후 emp 테이블과 내부조인(DT syntax)을 수행하여서 회계부서에서 근무하는 직원의 정보를 출력한다.

    R Programming
    %%R
    
    DT      <- data.table(emp)
    dept_DT <- data.table(dept)
    
    DT[ dept_DT[dname == "ACCOUNTING", .(deptno)] , on=c("deptno")] 

     

    Results
       empno  ename       job  mgr   hiredate  sal comm deptno
    1:  7782  CLARK   MANAGER 7839 1981-01-09 2450   NA     10
    2:  7839   KING PRESIDENT   NA 1981-11-17 5000   NA     10
    3:  7934 MILLER     CLERK 7782 1982-01-23 1300   NA     10

     


    8. SAS Proc SQL

    • 비상관 서브쿼리
    SAS Programming
    %%SAS sas
    
    PROC SQL;
      CREATE TABLE STATSAS_1 AS
        select ename 
        from   emp 
        where  deptno = (select deptno from dept where dname='ACCOUNTING');
    QUIT;
    PROC PRINT;RUN;

     

    Results
    OBS ename
    1 CLARK
    2 KING
    3 MILLER

     


    • IN 구문과 비상관 서브쿼리
    SAS Programming
    %%SAS sas
    
    PROC SQL;
      CREATE TABLE STATSAS_1 AS
        select ename 
        from   emp 
        where  deptno in (select deptno from dept where dname='ACCOUNTING');
    QUIT;
    PROC PRINT;RUN;

     

    Results
    OBS ename
    1 CLARK
    2 KING
    3 MILLER

     


    9. SAS Data Step

    • 데이터 Merge
    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='ACCOUNTING') IN=B);
         BY deptno;
         IF A AND B;
    RUN;
    
    PROC PRINT;RUN;

     

    Results
    OBS empno ename job mgr hiredate sal comm deptno dname loc
    1 7782 CLARK MANAGER 7839 1981-01-09 2450 . 10 ACCOUNTING NEW YORK
    2 7839 KING PRESIDEN . 1981-11-17 5000 . 10 ACCOUNTING NEW YORK
    3 7934 MILLER CLERK 7782 1982-01-23 1300 . 10 ACCOUNTING NEW YORK

     


    10. Python Dfply Package

    • FIlter_by() 함수
    Python Programming
    # [참고] 함수 사용. (52번 예제 참고)
    @pipe
    def pull_fun(df, column=-1):
        return df.loc[:, column].item()
    
    emp >> filter_by( X.deptno == ( dept >> filter_by( X.dname == "ACCOUNTING") >> select(X.deptno) >> pull_fun("deptno") ) )

     

    Results
      empno ename job mgr hiredate sal comm deptno
    6 7782 CLARK MANAGER 7839.0 1981/01/09 2450 NaN 10
    8 7839 KING PRESIDENT NaN 1981/11/17 5000 NaN 10
    13 7934 MILLER CLERK 7782.0 1982/01/23 1300 NaN 10

     

     


     

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

     

    반응형

    댓글