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

[상관 서브쿼리] 특정 조건에 해당하는 데이터 삭제 - 119 (오라클 SQL, R, Python, SAS)

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

포스팅 목차

     

    119. Delete those department where no employee working?

     

     

    * DEPT 테이블에서 직원이 근무하지 않는(배정되어 있지 않은) 부서 정보를 삭제하시오.


    • Oracle : 상관 서브쿼리, Delete 구문
    • 파이썬 Pandas : pd.merge(), query()
    • R 프로그래밍 : merge(), subset(), aggregate(), setNames() - 변수명 설정, names()
    • R Dplyr Package : dplyr::left_join(), dplyr::tally(), dplyr::filter()
    • R sqldf Package : 상관 서브쿼리, Delete 구문, Left Join
    • Python pandasql Package : 상관 서브쿼리, Delete 구문
    • R data.table Package : DT Syntax 방식 데이터 결합, Merge 방식의 데이터 결합, .N, keyby=
    • SAS Proc SQL : 상관 서브쿼리, Delete 구문, Left Join
    • SAS Data Step : PROC SUMMARY의 N, Merge 구문, If 조건문
    • Python Dfply Package : left_join(), summarize(), count(), filter_by()
    • 파이썬 Base 프로그래밍 :

     


    1. Oracle(오라클)

    dept 테이블에서 emp 테이블을 상관 서브쿼리로 조회 하여서 emp 테이블에 존재하지 않은 부서의 정보를 삭제한다.

     

    Oracle Programming
    create table dept_copy as
      select * from dept;
    
    delete from dept_copy d 
    where  0 = (select count(*) from emp where deptno = d.deptno);
    
    select *
    from   dept_copy;

     

     


    2. Python Pandas(파이썬)

    emp 테이블에서 부서번호(‘deptno’)에 속한 직원수를 카운트 후 dept 테이블을 기준으로 left join 을 수행하여서 해당 부서에 속한 직원이 존재하는 부서를 선택한다.

     

    Python Programming
    pd.merge( dept,
              (emp.groupby('deptno')['empno'].describe()[['count']].reset_index()),
              "left", 
              left_on=['deptno'], right_on=['deptno']
              ).query("count > 0")

     


    Results
      deptno dname loc count
    0 10 ACCOUNTING NEW YORK 3.0
    1 20 RESEARCH DALLAS 5.0
    2 30 SALES CHICAGO 6.0

     


    3. R Programming (R Package)

    emp 테이블에서 부서번호(‘deptno’)에 속한 직원수를 카운트 후 dept 테이블을 기준으로 left join 을 수행하여서 해당 부서에 속한 직원이 존재하는 부서를 선택한다.

     

    R Programming
    %%R
    
    subset( merge( dept,
                   ( setNames ( aggregate(empno~deptno,data=emp,FUN=length) , c("deptno","emp_count") ) ),
                   by.x=c("deptno"),by.y=c("deptno"),all=T
                   ), 
            emp_count > 0 )

     

    Results
      deptno      dname      loc emp_count
    1     10 ACCOUNTING NEW YORK         3
    2     20   RESEARCH   DALLAS         5
    3     30      SALES  CHICAGO         6

     


    [참고] 변수 이름 변경(renmae)하기

    • setNames / names
    R Programming
    %%R
    
    temp <- aggregate(empno~deptno,data=emp,FUN=length)
    print(temp)
    print("----------------------------")
    names(temp)[names(temp)=="empno"] <- "emp_count"
    print(temp)

     

    Results
      deptno empno
    1     10     3
    2     20     5
    3     30     6
    [1] "----------------------------"
      deptno emp_count
    1     10         3
    2     20         5
    3     30         6

     


    4. R Dplyr Package

    emp 테이블에서 부서번호(‘deptno’)에 속한 직원수를 카운트 후 dept 테이블을 기준으로 left join 을 수행하여서 해당 부서에 속한 직원이 존재하는 부서를 선택한다.

     

    R Programming
    %%R
    
    dept %>%
      dplyr::left_join ( ( emp %>% 
                             dplyr::group_by( deptno ) %>%
                             dplyr::tally() ),
                          by = c("deptno" = "deptno") ) %>%
      dplyr::filter(n >0)

     

    Results
    # A tibble: 3 x 4
      deptno dname      loc          n
       <dbl> <chr>      <chr>    <int>
    1     10 ACCOUNTING NEW YORK     3
    2     20 RESEARCH   DALLAS       5
    3     30 SALES      CHICAGO      6

     


    5. R sqldf Package

    dept 테이블에서 emp 테이블을 상관 서브쿼리로 조회 하여서 emp 테이블에 존재하지 않은 부서의 정보를 삭제한다.

    • Sqlite 의 update / delete 구문 : select / where 구문으로 처리 가능 (98번 / 119번)
    R Programming
    %%R
    
    withmooc = dept
    print(withmooc)
    print("-----------------------------------")
    withmooc <- sqldf(c(" delete from withmooc 
                          where  0 = (select count(*) from emp where deptno=withmooc.deptno);",
                        "select * from withmooc"))
    
    print(withmooc)

     

    Results
    # A tibble: 4 x 3
      deptno dname      loc     
       <dbl> <chr>      <chr>   
    1     10 ACCOUNTING NEW YORK
    2     20 RESEARCH   DALLAS  
    3     30 SALES      CHICAGO 
    4     40 OPERATIONS BOSTON  
    [1] "-----------------------------------"
      deptno      dname      loc
    1     10 ACCOUNTING NEW YORK
    2     20   RESEARCH   DALLAS
    3     30      SALES  CHICAGO

     


    emp 테이블에서 부서번호(‘deptno’)에 속한 직원수를 카운트 후 dept 테이블에 left join 을 수행하여 직원수를 추가한 후 해당 부서에 속한 직원이 존재하는 부서를 선택한다.

     

    R Programming
    %%R
    
    sqldf("select * 
           from dept a 
                left join ( select deptno,count(*) emp_cnt
                            from   emp
                            group 
                               by  deptno) b
                     on    a.deptno = b.deptno
           where b.deptno is not null")

     

    Results
      deptno      dname      loc deptno emp_cnt
    1     10 ACCOUNTING NEW YORK     10       3
    2     20   RESEARCH   DALLAS     20       5
    3     30      SALES  CHICAGO     30       6

     

     


    6. Python pandasql Package

    • 현재 pandasql에서 update 제대로 작동 안 함.
    Python Programming
    withmooc= dept.copy()
    display(withmooc)
    
    ps.sqldf("select * from withmooc where 0 < (select count(*) from emp where deptno=withmooc.deptno);")

     


    Results
      deptno dname loc
      10 ACCOUNTING NEW YORK
      20 RESEARCH DALLAS
      30 SALES CHICAGO
      40 OPERATIONS BOSTON

    Results
      deptno dname loc
      10 ACCOUNTING NEW YORK
      20 RESEARCH DALLAS
      30 SALES CHICAGO

     


     

    Python Programming
    ps.sqldf("select *                                  \
              from dept a                               \
                   left join ( select deptno,count(*)   \
                               from   emp               \
                               group by deptno) b       \
                        on    a.deptno = b.deptno       \
              where b.deptno is not null")

     

    Results
      deptno dname loc deptno count(*)
    0 10 ACCOUNTING NEW YORK 10 3
    1 20 RESEARCH DALLAS 20 5
    2 30 SALES CHICAGO 30 6

     

     


    7. R data.table Package

     

    DT syntax 방식

    emp 테이블에서 부서번호(‘deptno’)에 속한 직원수를 카운트 후 dept 테이블에 DT Syntax 방식으로 left join 을 수행하여 직원수를 추가한 후 해당 부서에 속한 직원이 존재하는 부서를 선택한다.

    • DT syntax 방식으로 Left join 구현 시 기준 테이블(왼쪽)이 내부로 들어감. (dept_DT)
    R Programming

     

    %%R
    DT          <- data.table(emp)
    dept_DT     <- data.table(dept)
    salgrade_DT <- data.table(salgrade)
    
    DT[, .(`emp_count` = .N), keyby = .(deptno)][ dept_DT,
                                                  on = .(deptno = deptno) ][emp_count>0]  

     

    Results
       deptno emp_count      dname      loc
    1:     10         3 ACCOUNTING NEW YORK
    2:     20         5   RESEARCH   DALLAS
    3:     30         6      SALES  CHICAGO

     


    data.table::merge() syntax

    emp 테이블에서 부서번호(‘deptno’)에 속한 직원수를 카운트 후 dept 테이블에 merge Syntax 방식으로 left join 을 수행하여 직원수를 추가한 후 해당 부서에 속한 직원이 존재하는 부서를 선택한다.

     

    R Programming
    %%R
    
    merge( dept_DT, 
           ( DT[, .(`emp_count` = .N), keyby = .(deptno)] ),
           by.x=c("deptno"),by.y=c("deptno"), all.x=T)[emp_count>0]

     

    Results
       deptno      dname      loc emp_count
    1:     10 ACCOUNTING NEW YORK         3
    2:     20   RESEARCH   DALLAS         5
    3:     30      SALES  CHICAGO         6

     


    R Programming
    %%R
    
    merge( dept_DT, 
           ( DT[, .(`emp_count` = .N), keyby = .(deptno)] ),
           by="deptno", all.x=T)[emp_count>0]

     

    Results
       deptno      dname      loc emp_count
    1:     10 ACCOUNTING NEW YORK         3
    2:     20   RESEARCH   DALLAS         5
    3:     30      SALES  CHICAGO         6

     


    8. SAS Proc SQL

    dept 테이블에서 emp 테이블을 상관 서브쿼리로 조회 하여서 emp 테이블에 존재하지 않은 부서의 정보를 삭제한다.

     

    SAS Programming
    %%SAS sas
    
    PROC SQL;
      create table dept_copy as
        select *
        from   dept;
    
      delete from dept_copy d 
        where  0 = (select count(*) from emp where deptno = d.deptno);
    QUIT;
    
    PROC PRINT;RUN;

     


    Results
    OBS deptno dname loc
    1 10 ACCOUNTING NEW YORK
    2 20 RESEARCH DALLAS
    3 30 SALES CHICAGO

     


     

    SAS Programming
    %%SAS sas
    
    PROC SQL;
      create table STATSAS_1 as
        select *
        from   dept d 
        where  0 < (select count(*) from emp where deptno = d.deptno);
    QUIT;
    
    PROC PRINT;RUN;

     

    Results
    OBS deptno dname loc
    1 10 ACCOUNTING NEW YORK
    2 20 RESEARCH DALLAS
    3 30 SALES CHICAGO

     


     

    SAS Programming
    %%SAS sas
    
    PROC SQL;
      create table STATSAS_2 as
        select * 
           from dept a 
                left join ( select deptno,count(*) as emp_cnt
                            from   emp
                            group 
                               by  deptno) b
                     on    a.deptno = b.deptno
           where b.deptno is not null;
    QUIT;
    
    PROC PRINT;RUN;
     

     

    Results
    OBS deptno dname loc emp_cnt
    1 10 ACCOUNTING NEW YORK 3
    2 20 RESEARCH DALLAS 5
    3 30 SALES CHICAGO 6

     

     


    9. SAS Data Step

     

    SAS Programming
    %%SAS sas
    
    PROC SORT DATA=DEPT OUT=DEPT_1;
         BY DEPTNO;
    RUN;
    
    PROC SUMMARY DATA=EMP;
         CLASS DEPTNO;
         VAR EMPNO;
         OUTPUT OUT=EMP_1(DROP=_:) N=;
    QUIT;
    
    DATA STATSAS_3;
     MERGE DEPT_1(IN=A) EMP_1(IN=B);
         BY DEPTNO;
         IF A AND B THEN OUTPUT;
         DROP EMPNO;
    RUN;
    
    PROC PRINT;RUN;

     

    Results
    OBS deptno dname loc
    1 10 ACCOUNTING NEW YORK
    2 20 RESEARCH DALLAS
    3 30 SALES CHICAGO

     

     


    10. Python Dfply Package

     

    Python Programming
    dept >> \
      left_join( ( emp >> group_by('deptno') >> summarize( emp_cnt = X.empno.count()) ) ,
                 by="deptno") >> \
      filter_by(X.emp_cnt > 0)

     


    Results
      deptno dname loc emp_cnt
    0 10 ACCOUNTING NEW YORK 3.0
    1 20 RESEARCH DALLAS 5.0
    2 30 SALES CHICAGO 6.0

     

     


     

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

    반응형

    댓글