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

[문자길이(length)] 특정 조건을 만족하는 데이터 추출 - 비상관 서브쿼리(In) - 136 (오라클 SQL, R, Python, SAS)

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

포스팅 목차

     

    136. Display the department name the no of characters of which is equal to no of employees in any other department?

     

    * 부서이름의 길이와 부서에 속한 부서원의 숫자와 같은 부서의 정보를 출력하시오.


    • Oracle : 비상관 서브쿼리, Length()
    • 파이썬 Pandas : str.len(), Groupby(), count()
    • R 프로그래밍 : stringr::str_length(), %in%, unlist(), aggregate()의 length
    • R Dplyr Package : nchar(), as.character(), %in%, tally(), unlist()
    • R sqldf Package : 비상관 서브쿼리, Length()
    • Python pandasql Package : 비상관 서브쿼리, Length()
    • R data.table Package : stringr::str_length(), %in%, .N
    • SAS Proc SQL : 비상관 서브쿼리, Length()
    • SAS Data Step : LENGTH 함수, compress 함수, Proc summary의 N, Merge 구문, IF 조건문
    • Python Dfply Package : @pipe & def 사용자 정의 함수(pull_list), str.len() , isin(), summarize() 의 Count()
    • 파이썬 Base 프로그래밍 :

     


    1. Oracle(오라클)

    서브쿼리에서 부서별 직원수를 카운트 후 dept 테이블에서 부서 이름의 길이와 동일한 부서의 정보를 출력한다.

    Select dname 
    from   dept 
    where  length(dname) in (select count(*) from emp group by deptno);

     


    2. Python Pandas(파이썬)

    부서별 직원수를 카운트 후 isin() 함수를 사용하여서 dept 테이블에서 부서 이름의 길이와 같은 부서 정보를 출력한다.

    dept[ dept['dname'].str.len().isin(emp.groupby('deptno')['ename'].count().reset_index().ename) ]

     

    Results
      deptno dname loc
    2 30 SALES CHICAGO

     


    3. R Programming (R Package)

    aggregate() 함수를 사용하여 부서별 직원수를 카운트 후 이 선택된 결과를 %in% 함수를 통하여 dept 테이블에서 부서 이름의 길이와 같은 부서 정보를 출력한다.

    %%R
    dept[ stringr::str_length(dept$dname) %in% unlist(aggregate(empno~deptno, emp, length)[, "empno" ])  ,  ]

     

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

     


    4. R Dplyr Package

    부서별 직원수를 카운트 후 이 선택된 결과를 %in% 함수를 통하여 dept 테이블에 전달하여서 부서 이름의 길이와 같은 부서 정보를 출력한다.

    %%R
    dept %>% filter( nchar(as.character(dname)) %in% ( emp %>% group_by(deptno) %>% tally() %>% dplyr::select(n) %>% unlist() ) )

     

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

     


    5. R sqldf Package

    서브쿼리에서 부서별 직원수를 카운트 후 dept 테이블에서 부서 이름의 길이와 같은 부서 정보를 출력한다.

    %%R
    
    sqldf(" Select * 
            from   dept 
            where  length(dname) in (select count(*) from emp group by deptno);")

     

    Results
      deptno dname     loc
    1     30 SALES CHICAGO

     


    6. Python pandasql Package

     

    서브쿼리에서 부서별 직원수를 카운트 후 dept 테이블에서 부서 이름의 길이와 동일한 부서의 정보를 출력한다.

    import copy
    
    ps.sqldf(" Select * from dept                                                 \
               where  length(dname) in (select count(*) from emp group by deptno); ")

     

    Results
      deptno dname loc
    0 30 SALES CHICAGO

     


    7. R data.table Package

    부서별 직원수를 카운트 후 이 선택된 결과를 %in% 함수를 통하여 dept 테이블에 전달하여서 부서 이름의 길이와 같은 부서 정보를 출력한다.

    %%R
    
    DT          <- data.table(emp)
    dept_DT     <- data.table(dept)
    salgrade_DT <- data.table(salgrade)
    
    dept_DT[stringr::str_length(dname) %in% DT[, .N, by = .(deptno)]$N,]

     

    Results
       deptno dname     loc
    1:     30 SALES CHICAGO

     


    8. SAS Proc SQL

     

    서브쿼리에서 부서별 직원수를 카운트 후 dept 테이블에서 부서 이름의 길이와 동일한 부서의 정보를 출력한다.

    %%SAS sas
    
    PROC SQL;
      create table STATSAS_1 as
        Select dname 
        from   dept 
        where  length(dname) in (select count(*) from emp group by deptno); 
    QUIT;
    PROC PRINT;RUN;

     

    Results
    OBS dname
    1 SALES

     


    9. SAS Data Step

    %%SAS sas
    
    DATA DEPT_1;
     SET DEPT;
         DNAME_LEN = LENGTH(COMPRESS(DNAME));
    RUN;
    
    PROC SORT DATA=DEPT_1;
         BY DNAME_LEN;
    RUN;
    
    PROC SUMMARY DATA = EMP NWAY;
         CLASS DEPTNO;
         VAR EMPNO;
         OUTPUT OUT=EMP_1(DROP=_:) N=DNAME_LEN;
    QUIT;
    PROC SORT DATA=EMP_1;
         BY DNAME_LEN;
    RUN;
    
    * DATA STEP;
    DATA STATSAS_2; 
     MERGE DEPT_1(IN=A) EMP_1(IN=B);
          BY DNAME_LEN;
          IF A AND B;
    RUN;
    PROC PRINT;RUN;

     


    Results
    OBS deptno dname loc DNAME_LEN
    1 20 SALES CHICAGO 5

     


    10. Python Dfply Package

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

     


    Results
      deptno dname loc
    2 30 SALES CHICAGO

     


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

    반응형

    댓글