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

[데이터 추출] 해당 그룹에 대한 특정 조건을 만족하는 그룹 리스트 출력 - 110

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

포스팅 목차

     

    110. Display dname where at least 3 are working and display only dname.

     

    * 부서내 직원 수가 4명 이상인 부서의 부서 정보를 출력하시오.


    • Oracle : 비상관 서브쿼리, having count(*)
    • 파이썬 Pandas : isin(), groupby(), count(), query(), pd.merge()
    • R 프로그래밍 : subset(), aggregate(), merge(), subset()
    • R Dplyr Package : %in%, dplyr::tally(), dplyr::filter(), dplyr::pull(), dplyr::inner_join()
    • R sqldf Package : 비상관 서브쿼리, having count(*)
    • Python pandasql Package : 비상관 서브쿼리, having count(*)
    • R data.table Package : DT syntax 방식 데이터 결합, .N, %in%
    • SAS Proc SQL : 비상관 서브쿼리, having count(*)
    • SAS Data Step : PROC SUMMARY, Merge 구문, IF 조건문
    • Python Dfply Package : @dfpipe & def 사용자 정의 함수(pull_fun), isin(), summarize(), n()
    • 파이썬 Base 프로그래밍 :

     


    1. Oracle(오라클)

    서브쿼리에서 EMP테이블에서 부서별 직원의 수가 4명 이상인 부서를 선택 후 DEPT 테이블에서 해당 부서를 검색하여 부서별 직원수가 4명이 이상인 부서 정보를 출력한다.

     

    Oracle Programming
    select dname,loc
    from   dept 
    where  deptno in (select deptno from emp group by deptno having count(*)>3);

     


     

    Oracle Programming
    select dname, loc
    from   dept A, 
           (select deptno from emp group by deptno having count(*)>3) B
    where  a.deptno = b.deptno

     


    2. Python Pandas(파이썬)

    EMP테이블에서 부서별 직원수가 4명 이상인 부서를 선택 후 DEPT 테이블에서 해당 부서 정보를 출력한다.

     

    Python Programming
    dept[dept.deptno.isin(emp.groupby('deptno')['sal'].count().reset_index().query('sal > 3').deptno)]

     


    Results
      deptno dname loc
    1 20 RESEARCH DALLAS
    2 30 SALES CHICAGO

     


    EMP테이블에서 부서별 직원수가 4명 이상인 부서를 선택 후 DEPT 테이블과 내부조인(Inner join)을 수행하여 부서별 직원수가 4명 이상인 부서 정보를 출력한다.

     

    Python Programming
    pd.merge( dept, (emp.groupby('deptno')['sal'].count().reset_index().query('sal > 3')), 
              how='inner', left_on=['deptno'], right_on=['deptno'])

     


    Results
      deptno dname loc sal
    0 20 RESEARCH DALLAS 5
    1 30 SALES CHICAGO 6

     


    3. R Programming (R Package)

    EMP테이블에서 부서별 직원수가 4명 이상인 부서를 선택 후 subset 함수를 지정하여 DEPT 테이블에서 해당 부서 정보를 출력한다.

     

    R Programming
    %%R
    
    subset( aggregate(sal~deptno, emp, length), sal>3 )

     

    Results
      deptno sal
    2     20   5
    3     30   6

     


    EMP테이블에서 부서별 직원수가 4명 이상인 부서를 선택 후 merge 연산자에 DEPT 테이블과 함께 지정하여 내부조인(Inner join)을 수행하여 부서별 직원수가 4명 이상인 부서 정보를 출력한다.

     

    R Programming
    %%R
    
    merge( dept,
           (subset( aggregate(sal~deptno, emp, length),sal>3 )),
           by.x=c("deptno"),by.y=c("deptno"),all.x=F)

     

    Results
      deptno    dname     loc sal
    1     20 RESEARCH  DALLAS   5
    2     30    SALES CHICAGO   6

     


    4. R Dplyr Package

    EMP테이블에서 부서별 직원수가 4명 이상인 부서를 선택 후 filter 함수를 지정하여 DEPT 테이블에서 해당 부서 정보를 출력한다.

     

    R Programming
    %%R
    
    dept %>% 
      dplyr::filter(deptno %in% ( emp%>%
                                     dplyr::group_by(deptno) %>%
                                     dplyr::tally() %>%
                                     dplyr::filter(n >3) %>%
                                     dplyr::select(deptno) %>%
                                     dplyr::pull()  ) )

     

    Results
    # A tibble: 2 x 3
      deptno dname    loc    
       <dbl> <chr>    <chr>  
    1     20 RESEARCH DALLAS 
    2     30 SALES    CHICAGO

     


    EMP테이블에서 부서별 직원수가 4명 이상인 부서를 선택 후 DEPT 테이블과 내부조인(Inner join)을 수행하여 부서별 직원수가 4명 이상인 부서 정보를 출력한다.

     

    R Programming
    %%R
    
    dept %>%
      dplyr::inner_join( emp %>%
                           dplyr::group_by(deptno) %>%
                           dplyr::tally() %>%
                           dplyr::filter(n > 3) , by = c('deptno' = 'deptno') )

     

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

     


    5. R sqldf Package

    서브쿼리에서 EMP테이블에서 부서별 직원의 수가 4명 이상인 부서를 선택 후 DEPT 테이블에서 해당 부서를 검색하여 부서별 직원수가 4명이 이상인 부서 정보를 출력한다.

     

    R Programming
    %%R
    
    sqldf(" select dname, loc
            from   dept
            where  deptno in (select deptno from emp group by deptno having count(*)>3);")

     

    Results
         dname     loc
    1 RESEARCH  DALLAS
    2    SALES CHICAGO

     


    EMP테이블에서 부서별 직원수가 4명 이상인 부서를 선택 후 DEPT 테이블과 내부조인(Inner join)을 수행하여 부서별 직원수가 4명 이상인 부서 정보를 출력한다.

     

    R Programming
    %%R
    
    sqldf("select dname, loc
           from   dept A, 
                  (select deptno from emp group by deptno having count(*)>3) B
           where  a.deptno = b.deptno")

     

    Results
         dname     loc
    1 RESEARCH  DALLAS
    2    SALES CHICAGO

     


    6. Python pandasql Package

    서브쿼리에서 EMP테이블에서 부서별 직원의 수가 4명 이상인 부서를 선택 후 DEPT 테이블에서 해당 부서를 검색하여 부서별 직원수가 4명이 이상인 부서 정보를 출력한다.

     

    Python Programming
    ps.sqldf("select dname   \
              from   dept    \
              where  deptno in (select deptno from emp group by deptno having count(*)>3);")

     


    Results
      dname
    0 RESEARCH
    1 SALES

     


     

    Python Programming
    ps.sqldf("select dname \
             from    dept A, (select deptno from emp group by deptno having count(*)>3) B \
             where   a.deptno = b.deptno")

     

    Results

      dname
    0 RESEARCH
    1 SALES

     


    7. R data.table Package

     

    EMP테이블에서 부서별 직원수가 4명 이상인 부서를 선택 후 DEPT 테이블과 내부조인(Inner join)을 수행하여 부서별 직원수가 4명 이상인 부서 정보를 출력한다.

     

    R Programming
    %%R
    DT          <- data.table(emp)
    dept_DT     <- data.table(dept)
    
    dept_DT[DT[, .N, by = .(deptno)][N > 3], nomatch=NULL, on=.(deptno=deptno),]

     

    Results
       deptno    dname     loc N
    1:     20 RESEARCH  DALLAS 5
    2:     30    SALES CHICAGO 6

     


    EMP테이블에서 부서별 직원의 수가 4명 이상인 부서를 선택 후 DEPT 테이블에서 해당 부서를 검색하여 부서별 직원수가 4명이 이상인 부서 정보를 출력한다.

     

    R Programming
    %%R
    
    DT          <- data.table(emp)
    dept_DT     <- data.table(dept)
    salgrade_DT <- data.table(salgrade)
    
    dept_DT[deptno %in% DT[, .N, by = .(deptno)][N > 3]$deptno,]

     

    Results
       deptno    dname     loc
    1:     20 RESEARCH  DALLAS
    2:     30    SALES CHICAGO

     


    8. SAS Proc SQL

    서브쿼리에서 EMP테이블에서 부서별 직원의 수가 4명 이상인 부서를 선택 후 DEPT 테이블에서 해당 부서를 검색하여 부서별 직원수가 4명이 이상인 부서 정보를 출력한다.

     

    SAS Programming
    %%SAS sas
    
    PROC SQL;
      CREATE TABLE STATSAS_1 AS
        select dname from dept 
        where  deptno in (select deptno from emp group by deptno having count(*)>3);;
    QUIT;
    PROC PRINT;RUN;

     


    Results
    OBS dname
    1 RESEARCH
    2 SALES

     


     

    SAS Programming
    %%SAS sas
    
    PROC SQL;
      CREATE TABLE STATSAS_1 AS
        select dname,
               COUNT(*) AS EMP_CNT
        from   dept A, emp B
        where  a.deptno = b.deptno
        GROUP 
           BY  1
        HAVING COUNT(*) > 3;
    QUIT;
    PROC PRINT;RUN;

     


    Results
    OBS dname EMP_CNT
    1 RESEARCH 5
    2 SALES 6

     


    9. SAS Data Step

     

    SAS Programming
    %%SAS sas
    
    PROC SORT DATA=dept OUT=dept_1;
         BY deptno;
    RUN;
    
    PROC SUMMARY DATA=EMP NWAY;
         CLASS DEPTNO;
         VAR   EMPNO;
         OUTPUT OUT=EMP_1(DROP=_:) N=EMP_CNT;
    RUN;
    
    PROC SORT DATA=EMP_1;
         BY DEPTNO;
    RUN;
    
    DATA STATSAS_2;
     MERGE dept_1(IN=A) EMP_1(IN=B);
         IF (A AND B) AND EMP_CNT > 3 THEN OUTPUT;
    RUN;
    PROC PRINT;RUN;

     

    Results
    OBS deptno dname loc EMP_CNT
    1 20 RESEARCH DALLAS 5
    2 30 SALES CHICAGO 6

     


    10. Python Dfply Package

     

    Python Programming
    # [참고] 함수 사용. (52번 예제 참고)
    
    @dfpipe
    def pull_fun(df, column=-1):
        return df.loc[:, column].item()
    
    dept >> \
      filter_by( X.deptno.isin( emp >> group_by(X.deptno) >> summarize(emp_cnt = n(X.empno)) >> filter_by(X.emp_cnt > 3) >> select(X.deptno) >> pull_fun("deptno") ))

     

    Results
      deptno dname loc
    1 20 RESEARCH DALLAS
    2 30 SALES CHICAGO

     


     

    Python Programming
    dept >> \
      inner_join( (emp >> group_by(X.deptno) >> summarize(emp_cnt = n(X.empno)) >> filter_by(X.emp_cnt > 3)) , by="deptno" )

     

    Results
      deptno dname loc emp_cnt
    0 20 RESEARCH DALLAS 5
    1 30 SALES CHICAGO 6

     


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

    반응형

    댓글