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

[건수 카운트] 특정 조건을 만족하는 데이터 추출 - 비상관 서브쿼리(In) - 138 (오라클 SQL, R, Python, SAS)

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

포스팅 목차

     

    138. Count the no of employees who are working as manager (use set operation)?

     

    * 관리자 역할을 수행하고 있는 직원들의 수를 카운트하시오.


    • 파이썬 & R 패키지 호출 및 예제 데이터 생성 링크
    • 서브쿼리 유사문제 : 86번 / 137번 / 111번 / 120번(Merge 방식 포함) / 128번(Unique구문 추가)
    • [데이터 추출] 특정 조건을 만족하는 데이터 추출 - 비상관 서브쿼리(In), 관측치 갯수
    • 데이터 전처리 -SQL, Pandas, R Prog, Dplyr, Dfply, SQLDF, PANDASQL, DATA.TABLE, SAS, Proc Sql
    • Oracle : 비상관 서브쿼리, Count(*), intersect - 교집합
    • 파이썬 Pandas : isin(), count()
    • R 프로그래밍 : %in%, unlist(), count()
    • R Dplyr Package : %in%, unlist(), summarize() 의 n_distinct()
    • R sqldf Package : 비상관 서브쿼리, Count(*), intersect - 교집합
    • Python pandasql Package : 비상관 서브쿼리, Count(*), intersect - 교집합
    • R data.table Package : %in%, length()
    • SAS Proc SQL : 비상관 서브쿼리, Count(*), intersect - 교집합
    • SAS Data Step : PROC SORT 의 Nodupkey, Merge 구문, IF 조건문, Proc summary
    • R dtplyr Package : lazy_dt(), as_tibble(), unlist(), summarize()의 n()
    • R tidytable Package : tidytable::filter.(), %in%, unlist(), Count.()
    • Python Dfply Package : isin(), summarize() 의 n(), @pipe & def 사용자 정의 함수(pull_list), count()
    • 파이썬 Base 프로그래밍 :

    1. Oracle(오라클)

    서브쿼리를 통하여 emp테이블의 관리자 사원번호(‘mgr’)에 명단이 존재하는 사원번호(‘empno’)를 카운트한다.

     

    Oracle Programming
    select count(*) emp_cnt
    from   emp 
    where  empno in (select mgr from emp);

     


    집합연산자(SET 연산자) 중 하나인 교집합(intersect OPERATOR)를 사용하여서 emp테이블의 사원번호(empno)와 관리자 사원번호(mgr)에 동일하게 존재하는 사원번호를 선택 후 선택된 사원들의 수를 집계한다.

     

    Oracle Programming
    select count(*) emp_cnt
    from   ( select empno from emp
             intersect
             select mgr   from emp )

     


    2. Python Pandas(파이썬)

    isin 함수를 사용하여 emp테이블의 관리자 사원번호(‘mgr’)에 명단이 존재하는 사원번호(‘empno’)를 선택 후 사원들의 수를 카운트한다.

     

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

     

    Results
    6

     


    3. R Programming (R Package)

    %in% 함수를 사용하여 emp테이블의 관리자 사원번호(‘mgr’)에 명단이 존재하는 사원번호(‘empno’)를 선택 후 사원들의 수를 카운트한다.

     

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

     

    Results
    # A tibble: 1 x 1
          n
      <int>
    1     6

     


    4. R Dplyr Package

    %in% 함수를 사용하여 emp테이블의 관리자 사원번호(‘mgr’)에 명단이 존재하는 사원번호(‘empno’)를 filter 함수로 선택 후 summarize() 함수를 통하여 선택된 사원들의 수를 카운트한다.

     

    R Programming
    %%R
    emp %>% 
      dplyr::filter( empno %in% ( emp %>% dplyr::select(mgr) %>% unlist() ) ) %>% 
      summarize( emp_cnt = n_distinct(empno,na.rm = TRUE))

     

    Results
    # A tibble: 1 x 1
      emp_cnt
        <int>
    1       6

     


    5. R sqldf Package

    서브쿼리를 통하여 emp테이블의 관리자 사원번호(‘mgr’)에 명단이 존재하는 사원번호(‘empno’)를 선택 후 선태된 사원들의 수를 카운트한다.

     

    R Programming
    %%R
    
    sqldf(" select count(*) emp_cnt 
            from   emp 
            where  empno in (select mgr from emp);")

     

    Results
      emp_cnt
    1       6

     


    집합연산자(SET 연산자) 중 하나인 교집합(intersect OPERATOR)를 사용하여서 emp테이블의 사원번호(empno)와 관리자 사원번호(mgr)에 동일하게 존재하는 사원번호를 선택 후 선택된 사원들의 수를 집계한다.

     

    R Programming
    %%R
    
    sqldf(" select count(*) emp_cnt
            from   ( select empno from emp
                     intersect
                     select mgr   from emp )" )

     

    Results
      emp_cnt
    1       6

     


    6. Python pandasql Package

    집합연산자(SET 연산자) 중 하나인 교집합(intersect OPERATOR)를 사용하여서 emp테이블의 사원번호(empno)와 관리자 사원번호(mgr)에 동일하게 존재하는 사원번호를 선택 후 선택된 사원들의 수를 집계한다.

     

    Python Programming
    ps.sqldf(" select count(*) emp_cnt          \
               from   ( select empno from emp   \
                        intersect               \
                        select mgr from emp )")

     


    Results
      emp_cnt
    0 6

     


    7. R data.table Package

    %in% 함수를 통하여 emp테이블의 관리자 사원번호(‘mgr’)에 명단이 존재하는 사원번호(‘empno’)를 선택 후 선택된 사원들의 급여 총합계와 사원들의 수를 집계한다.

     

    R Programming
    %%R
    
    DT          <- data.table(emp)
    dept_DT     <- data.table(dept)
    salgrade_DT <- data.table(salgrade)
    
    DT[ empno %in% DT[,mgr],.(total=sum(empno), n=length(empno))]

     

    Results
       total n
    1: 46575 6

     


    8. SAS Proc SQL

    서브쿼리를 통하여 emp테이블의 관리자 사원번호(‘mgr’)에 명단이 존재하는 사원번호(‘empno’)를 카운트한다.

     

    SAS Programming
    %%SAS sas
    
    PROC SQL;
      create table STATSAS_1 as
        select count(*) AS MGR_CNT
        from   emp 
        where  empno in (select mgr from emp); 
    QUIT;
    PROC PRINT;RUN;

     

    Results
    OBS MGR_CNT
    1 6

     


    집합연산자(SET 연산자) 중 하나인 교집합(intersect OPERATOR)를 사용하여서 emp테이블의 사원번호(empno)와 관리자 사원번호(mgr)에 동일하게 존재하는 사원번호를 선택 후 선택된 사원들의 수를 집계한다.

     

    SAS Programming
    %%SAS sas
    
    PROC SQL;
      create table STATSAS_2 as
        select count(*) AS MGR_CNT
        from   ( select empno from emp
                 intersect
                 select mgr   from emp ); 
    QUIT;
    PROC PRINT;RUN;

     

    Results
    OBS MGR_CNT
    1 6

     


    9. SAS Data Step

     

    SAS Programming
    %%SAS sas
    
    PROC SORT DATA=EMP OUT=EMP_1(RENAME=EMPNO=JOIN_KEY);
         BY EMPNO;
    RUN;
    
    PROC SORT DATA = EMP OUT=EMP_DUP(RENAME=MGR=JOIN_KEY) NODUPKEY;
         BY MGR;
    RUN;
    
    DATA STATSAS_2; 
     MERGE EMP_1(IN=A) EMP_DUP(IN=B);
          BY JOIN_KEY;
          IF A AND B;
    RUN;
    
    PROC SUMMARY DATA=STATSAS_2;
         VAR EMPNO;
         OUTPUT OUT=MGR_CNT(DROP=_:) N=MGR_CNT;
    quit;
    PROC PRINT;RUN;

     

    Results
    OBS MGR_CNT
    1 6

     


    10. R dtplyr Package

    %in% 함수를 사용하여 emp테이블의 관리자 사원번호(‘mgr’)에 명단이 존재하는 사원번호(‘empno’)를 filter() 함수로 선택 후 summarize() 함수를 통하여 선택된 사원들의 수를 집계한다.

     

    R Programming
    %%R
    # library(dplyr, warn.conflicts = FALSE)
    
    lazy_emp <- lazy_dt(emp)
    
    lazy_emp %>% 
      filter( empno %in% ( lazy_emp %>% select(mgr) %>% as_tibble() %>% unlist()  ) ) %>% 
      summarize( emp_count = n() )

     

    Results
    Source: local data table [?? x 1]
    Call:   `_DT2`[empno %in% (lazy_emp %>% select(mgr) %>% as_tibble() %>% 
        unlist()), .(emp_count = .N)]
    
      emp_count
          <int>
    1         6
    
    # Use as.data.table()/as.data.frame()/as_tibble() to access results

     


    11. R tidytable Package

    %in% 함수를 사용하여 emp테이블의 관리자 사원번호(‘mgr’)에 명단이 존재하는 사원번호(‘empno’)를 filter() 함수로 선택 후 count() 함수를 통하여 선택된 사원들의 수를 집계한다.

     

    R Programming
    %%R
    
    DT          <- data.table(emp)
    
    DT %>% 
      tidytable::filter.(empno %in% ( DT %>% select.(mgr) %>% unlist() )) %>% 
      count.()

     

    Results
    # tidytable [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

     


    12. Python dfply Package(파이썬)

    isin 함수를 사용하여 emp테이블의 관리자 사원번호(‘mgr’)에 명단이 존재하는 사원번호(‘empno’)를 filter_by 함수로 선택 후 summarize() 함수를 통하여 선택된 사원들의 수를 카운트한다.

     

    Python Programming
    emp >> \
      filter_by( X.empno.isin( (emp >> select(X.mgr))['mgr']  )) >>\
      summarize(emp_count = n(X.empno))

     

    Results
      emp_count
    0 6

     


     

    Python Programming
    # [참고] 함수 사용. (52번 예제 참고) : AttributeError: 'DataFrame' object has no attribute 'ix'
    @pipe
    def pull_list(df, column=-1):
        return df.loc[:, column]
    
    emp >> \
      filter_by( X.empno.isin( emp >> select(X.mgr) >> pull_list("mgr"))) >> \
      summarize( emp_cnt = X.empno.count())

     


    Results
      emp_cnt
    0 6

     


     

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

    반응형

    댓글