포스팅 목차
100. Display employee name, job, deptname, location for all who are working as managers.
* 관리자 역할을 수행하는 직원의 정보를 출력하시오.
- 파이썬 & R 패키지 호출 및 예제 데이터 생성 링크
 - 비상관 서브쿼리(Uncorrelated Subqueyr) 를 만족하는 데이터 추출 - In 연산자와 내부조인(Inner Join)
 
  | 
1. Oracle(오라클)
emp 테이블에서 관리자(‘mgr’) 사원번호에 해당하는 직원정보를 선택하고, 이 직원의 부서 정보를 추가한다.
| Oracle Programming | 
select ename,job,dname,loc 
from   emp e, dept d 
where  e.deptno = d.deptno 
  and  empno in (select mgr from emp);
| Oracle Programming | 
select e.ename, e.job,
       d.dname, d.loc 
from   emp e, dept d, (select distinct mgr from emp) f
where  e.deptno = d.deptno
  and  e.empno  = f.mgr;
2. Python Pandas(파이썬)
- 테이블.loc[lambda] 과 칼럼.apply(lambda)
 
관리자(‘mgr’) 사원번호를 선택 후 중복을 제거하고, query 메소드에서 선택된 변수명(‘list_of_values’)에 “@”를 붙여서 외부 변수값을 참조하여 관리자 역할을 수행하는 사원들을 선택 후 dept 테이블에서 부서 정보를 추가한다.
| Python Programming | 
list_of_values = list(emp['mgr'].drop_duplicates())
emp.query("empno in @list_of_values").merge(dept, how='inner', left_on=['deptno'], right_on=['deptno']).drop(['job','comm','hiredate'],axis=1)
| Results | 
| empno | ename | mgr | sal | deptno | dname | loc | 
| 7566 | JONES | 7839.0 | 2975 | 20 | RESEARCH | DALLAS | 
| 7788 | SCOTT | 7566.0 | 3000 | 20 | RESEARCH | DALLAS | 
| 7902 | FORD | 7566.0 | 3000 | 20 | RESEARCH | DALLAS | 
| 7698 | BLAKE | 7839.0 | 2850 | 30 | SALES | CHICAGO | 
| 7782 | CLARK | 7839.0 | 2450 | 10 | ACCOUNTING | NEW YORK | 
| 7839 | KING | NaN | 5000 | 10 | ACCOUNTING | NEW YORK | 
관리자(‘mgr’) 사원번호를 선택 후 중복을 제거하고, lambda 함수를 사용하여서 관리자 역할을 수행하는 사원들을 선택 후 dept 테이블과 결합(Join)하여 부서 정보를 추가한다.
| Python Programming | 
emp.loc[lambda emp: emp.empno.isin(list(emp['mgr'].drop_duplicates())) ].merge(dept, how='inner', left_on=['deptno'], right_on=['deptno'])[['ename','job','dname','loc']]
| Results | 
| ename | job | dname | loc | 
| JONES | MANAGER | RESEARCH | DALLAS | 
| SCOTT | ANALYST | RESEARCH | DALLAS | 
| FORD | ANALYST | RESEARCH | DALLAS | 
| BLAKE | MANAGER | SALES | CHICAGO | 
| CLARK | MANAGER | ACCOUNTING | NEW YORK | 
| KING | PRESIDENT | ACCOUNTING | NEW YORK | 
emp 테이블과 dept 테이블을 결합(Join)하여서 부서 정보를 추가한 후 다시 emp 테이블과 self join을 하여서 관리자(‘mgr’) 역할을 수행하는 직원 정보를 추출한다.
| Python Programming | 
pd.merge(emp, dept, how='inner', left_on=['deptno'], right_on=['deptno']).merge((emp['mgr'].drop_duplicates()), how='inner', left_on=['empno'], right_on=['mgr'] ).drop(['job','comm','hiredate'],axis=1) # [['ename','job','dname','loc']]
| Results | 
| empno | ename | mgr_x | sal | deptno | dname | loc | mgr_y | 
| 7566 | JONES | 7839.0 | 2975 | 20 | RESEARCH | DALLAS | 7566.0 | 
| 7788 | SCOTT | 7566.0 | 3000 | 20 | RESEARCH | DALLAS | 7788.0 | 
| 7902 | FORD | 7566.0 | 3000 | 20 | RESEARCH | DALLAS | 7902.0 | 
| 7698 | BLAKE | 7839.0 | 2850 | 30 | SALES | CHICAGO | 7698.0 | 
| 7782 | CLARK | 7839.0 | 2450 | 10 | ACCOUNTING | NEW YORK | 7782.0 | 
| 7839 | KING | NaN | 5000 | 10 | ACCOUNTING | NEW YORK | 7839.0 | 
3. R Programming (R Package)
%in% 연산자를 사용하여 사원번호(‘empno’)에서 관리자(‘mgr’) 사원번호를 선택한 후 dept 테이블과 결합(Join)하여 부서 정보를 추가한다.
| R Programming | 
%%R
merge(emp[emp$empno %in% emp$mgr,  ],dept,by.x=c("deptno"),
                                          by.y=c("deptno"),all.x=T)
| Results | 
  deptno empno ename       job  mgr   hiredate  sal comm      dname      loc
1     10  7782 CLARK   MANAGER 7839 1981-01-09 2450   NA ACCOUNTING NEW YORK
2     10  7839  KING PRESIDENT   NA 1981-11-17 5000   NA ACCOUNTING NEW YORK
3     20  7566 JONES   MANAGER 7839 1981-04-02 2975   NA   RESEARCH   DALLAS
4     20  7788 SCOTT   ANALYST 7566 1982-12-09 3000   NA   RESEARCH   DALLAS
5     20  7902  FORD   ANALYST 7566 1981-12-03 3000   NA   RESEARCH   DALLAS
6     30  7698 BLAKE   MANAGER 7839 1981-03-01 2850   NA      SALES  CHICAGO
4. R Dplyr Package
filter 함수에 %in% 연산자를 사용하여 사원번호(‘empno’) 중에서 관리자(‘mgr’) 사원번호를 선택하고, dept 테이블과 결합(Join)하여 부서 정보를 추가한다.
| R Programming | 
%%R
withmooc <- emp
emp %>% 
  dplyr::filter( empno %in% ( emp %>% dplyr::select(mgr) %>% pull(mgr) ) ) %>%
  dplyr::inner_join(dept, by = c('deptno' = "deptno"))
| Results | 
# A tibble: 6 x 10
  empno ename job         mgr hiredate     sal  comm deptno dname      loc     
  <dbl> <chr> <chr>     <dbl> <date>     <dbl> <dbl>  <dbl> <chr>      <chr>   
1  7566 JONES MANAGER    7839 1981-04-02  2975    NA     20 RESEARCH   DALLAS  
2  7698 BLAKE MANAGER    7839 1981-03-01  2850    NA     30 SALES      CHICAGO 
3  7782 CLARK MANAGER    7839 1981-01-09  2450    NA     10 ACCOUNTING NEW YORK
4  7788 SCOTT ANALYST    7566 1982-12-09  3000    NA     20 RESEARCH   DALLAS  
5  7839 KING  PRESIDENT    NA 1981-11-17  5000    NA     10 ACCOUNTING NEW YORK
6  7902 FORD  ANALYST    7566 1981-12-03  3000    NA     20 RESEARCH   DALLAS  
5. R sqldf Package
emp 테이블에서 관리자(‘mgr’) 사원번호에 해당하는 직원정보를 선택하고, 이 직원의 부서 정보를 추가한다.
| R Programming | 
%%R
withmooc <- emp
sqldf(" select e.ename, e.job,
               d.dname, d.loc 
        from   emp e, dept d 
        where  e.deptno = d.deptno 
          and  empno in (select mgr from emp);")
| Results | 
  ename       job      dname      loc
1 JONES   MANAGER   RESEARCH   DALLAS
2 BLAKE   MANAGER      SALES  CHICAGO
3 CLARK   MANAGER ACCOUNTING NEW YORK
4 SCOTT   ANALYST   RESEARCH   DALLAS
5  KING PRESIDENT ACCOUNTING NEW YORK
6  FORD   ANALYST   RESEARCH   DALLAS
6. Python pandasql Package
emp 테이블에서 관리자(‘mgr’) 사원번호에 해당하는 직원정보를 선택하고, 이 직원의 부서 정보를 추가한다.
| Python Programming | 
import copy
withmooc =copy.copy(emp)
ps.sqldf("SELECT ename,job,dname,loc FROM emp , dept  WHERE emp.deptno=dept.deptno and empno in (select mgr from emp)")
| Results | 
| ename | job | dname | loc | 
| JONES | MANAGER | RESEARCH | DALLAS | 
| BLAKE | MANAGER | SALES | CHICAGO | 
| CLARK | MANAGER | ACCOUNTING | NEW YORK | 
| SCOTT | ANALYST | RESEARCH | DALLAS | 
| KING | PRESIDENT | ACCOUNTING | NEW YORK | 
| FORD | ANALYST | RESEARCH | DALLAS | 
7. R data.table Package
%in% 연산자를 사용하여 사원번호(‘empno’)에서 관리자(‘mgr’) 사원번호를 선택한 후 dept 테이블과 결합(Join)하여 부서 정보를 추가한다. unlist 함수는 리스트를 벡터로 변경한다.
| R Programming | 
%%R
DT <- data.table(emp)
dept_DT <- data.table(dept)
XT <- DT[DT[,empno %in% unlist( DT[, .(mgr)] ),]]
XT[dept_DT, nomatch=NULL, on = "deptno",.(ename,job,dname,loc)]
| Results | 
   ename       job      dname      loc
1: CLARK   MANAGER ACCOUNTING NEW YORK
2:  KING PRESIDENT ACCOUNTING NEW YORK
3: JONES   MANAGER   RESEARCH   DALLAS
4: SCOTT   ANALYST   RESEARCH   DALLAS
5:  FORD   ANALYST   RESEARCH   DALLAS
6: BLAKE   MANAGER      SALES  CHICAGO
| R Programming | 
%%R
print( is.list(DT[, .(mgr)]) )
print( is.vector( unlist( DT[, .(mgr)] ) ) )
print( typeof(DT[, .(mgr)]) )
print( typeof( unlist( DT[, .(mgr)] ) ) )
| Results | 
[1] TRUE
[1] TRUE
[1] "list"
[1] "double"
8. SAS Proc SQL
emp 테이블에서 관리자(‘mgr’) 사원번호에 해당하는 직원정보를 선택하고, 이 직원의 부서 정보를 추가한다.
| SAS Programming | 
%%SAS sas
PROC SQL;
  CREATE TABLE STATSAS_1 AS
    select e.ename,e.job,d.dname,d.loc 
    from   emp e, dept d 
    where  e.deptno = d.deptno 
      and  empno in (select mgr from emp);
QUIT;
PROC PRINT;RUN;
| Results | 
| ename | job | dname | loc | 
| CLARK | MANAGER | ACCOUNTING | NEW YORK | 
| KING | PRESIDEN | ACCOUNTING | NEW YORK | 
| JONES | MANAGER | RESEARCH | DALLAS | 
| FORD | ANALYST | RESEARCH | DALLAS | 
| SCOTT | ANALYST | RESEARCH | DALLAS | 
| BLAKE | MANAGER | SALES | CHICAGO | 
9. SAS Data Step
| SAS Programming | 
%%SAS sas
PROC SORT DATA=EMP OUT=EMP_1;
     BY DEPTNO;
RUN;
PROC SORT DATA=dept OUT=dept_1;
     BY DEPTNO;
RUN;
data STATSAS_2;
 merge EMP_1(in=a) dept_1(in=b keep=deptno dname loc);
     by deptno;
     if a and b then output;
run;
PROC SORT DATA=STATSAS_2 OUT=STATSAS_21(rename= (empno = mgr_empno));
     BY empno;
RUN;
PROC SORT DATA=EMP OUT=mgr_1(rename= (MGR = mgr_empno) keep=mgr) NODUPKEY;
     BY MGR;
RUN;
data STATSAS_3;
 merge STATSAS_21(in=a) mgr_1(in=b);
     by mgr_empno;
     if a and b then output;
     keep ename job dname loc;
run;
proc sort data=STATSAS_3;
     by ename;
run;
PROC PRINT;RUN;
| Results | 
| ename | job | dname | loc | 
| BLAKE | MANAGER | SALES | CHICAGO | 
| CLARK | MANAGER | ACCOUNTING | NEW YORK | 
| FORD | ANALYST | RESEARCH | DALLAS | 
| JONES | MANAGER | RESEARCH | DALLAS | 
| KING | PRESIDEN | ACCOUNTING | NEW YORK | 
| SCOTT | ANALYST | RESEARCH | DALLAS | 
10. Python Dfply Package
| 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"))) >> \
  inner_join(dept, by="deptno")                                      >> \
  select(~X.job, ~X.hiredate, ~X.comm)
| Results | 
| empno | ename | mgr | sal | deptno | dname | loc | 
| 7566 | JONES | 7839.0 | 2975 | 20 | RESEARCH | DALLAS | 
| 7788 | SCOTT | 7566.0 | 3000 | 20 | RESEARCH | DALLAS | 
| 7902 | FORD | 7566.0 | 3000 | 20 | RESEARCH | DALLAS | 
| 7698 | BLAKE | 7839.0 | 2850 | 30 | SALES | CHICAGO | 
| 7782 | CLARK | 7839.0 | 2450 | 10 | ACCOUNTING | NEW YORK | 
| 7839 | KING | NaN | 5000 | 10 | ACCOUNTING | NEW YORK | 
[SQL, Pandas, R Prog, Dplyr, SQLDF, PANDASQL, DATA.TABLE] SQL EMP 예제로 만나는 테이블 데이터 전처리 방법 리스트
'통계프로그램 비교 시리즈 > 프로그래밍비교(Oracle,Python,R,SAS)' 카테고리의 다른 글
| [데이터 추출] 비상관 서브쿼리(Uncorrelated Subquery) 와 상관 서브쿼리(Correlated Subquery)를 만족하는 데이터 추출 - 비등가조인(NON-EQUI JOIN) 데이터 결합 - 102 (0) | 2022.09.29 | 
|---|---|
| [데이터 추출] 내부조인(Inner join)을 만족하는 데이터 추출 - 101 (0) | 2022.09.29 | 
| [데이터 삭제] Where 조건절을 만족하는 데이터 삭제-비상관서브쿼리 - 99 (0) | 2022.09.28 | 
| [데이터 변환] 조건절을 만족하는 데이터 변경 - 98 (0) | 2022.09.28 | 
| [데이터 추출] 비등가 조인에 해당하는 데이터 추출 - 97 (1) | 2022.09.28 | 

댓글