포스팅 목차
101. Display those employees whose manager names is Jones, and also display there manager name.
* 관리자 이름이 ‘Jones’인 직원 이름과 관리자(‘Jones’)의 이름을 출력하시오.
- 파이썬 & R 패키지 호출 및 예제 데이터 생성 링크
- 내부조인(Inner join)을 만족하는 데이터 추출
- Self join : 셀프조인, 자체 조인, 자체 결합
|
1. Oracle(오라클)
emp 테이블을 관리자(‘mgr’) 사원번호와 사원번호(‘empno’)를 기준으로 self join(셀프조인, 자체조인, 자체결합) 하여서 해당 관리자의 이름이 ‘Jones’인 사원을 선택한다.
Oracle Programming |
select e.empno, e.ename, m.ename MANAGER
from emp e, emp m
where e.mgr = m.empno
and m.ename = 'JONES';
2. Python Pandas(파이썬)
emp 테이블의 사원번호(‘empno’)와 emp 테이블에서 직원 이름이 ‘JONES’인 직원을 선택 후 이 테이블의 관리자(‘mgr’) 사원번호와 내부결합(Inner Join)하여서 해당 관리자의 이름이 ‘Jones’인 사원을 선택한다.
Python Programming |
pd.merge(emp, emp[emp['ename']=='JONES'], how='inner', left_on=['mgr'], right_on=['empno'])[['empno_x',"ename_x","ename_y"]]
Results |
empno_x | ename_x | ename_y |
7788 | SCOTT | JONES |
7902 | FORD | JONES |
3. R Programming (R Package)
emp 테이블의 사원번호(‘empno’)와 emp 테이블에서 직원 이름이 ‘JONES’인 직원을 선택 후 이 테이블의 관리자(‘mgr’) 사원번호와 내부결합(Inner Join)하여서 해당 관리자의 이름이 ‘Jones’인 사원을 선택한다.
R Programming |
%%R
merge(emp ,emp[emp$ename == 'JONES', ] , by.x=c("mgr"),
by.y=c("empno"),all.x=F)[,c("empno","ename.x","ename.y")]
Results |
empno ename.x ename.y
1 7788 SCOTT JONES
2 7902 FORD JONES
4. R Dplyr Package
emp 테이블의 사원번호(‘empno’)와 emp 테이블에서 직원 이름이 ‘JONES’인 직원을 선택 후 이 테이블의 관리자(‘mgr’) 사원번호를 기준으로 내부결합(Inner_Join)수행하여서 해당 관리자의 이름이 ‘Jones’인 사원을 선택한다.
R Programming |
%%R
emp %>%
dplyr::inner_join( ( emp %>% filter(ename == 'JONES') ), by = c('mgr' = "empno")) %>%
dplyr::select(empno,ename.x,ename.y)
Results |
# A tibble: 2 x 3
empno ename.x ename.y
<dbl> <chr> <chr>
1 7788 SCOTT JONES
2 7902 FORD JONES
5. R sqldf Package
emp 테이블을 관리자(‘mgr’) 사원번호와 사원번호(‘empno’)를 기준으로 self join 하여서 해당 관리자의 이름이 ‘Jones’인 사원을 선택한다.
R Programming |
%%R
sqldf("select e.empno, e.ename, m.ename MANAGER
from emp e, emp m
where e.mgr = m.empno
and m.ename = 'JONES';")
Results |
empno ename MANAGER
1 7788 SCOTT JONES
2 7902 FORD JONES
6. Python pandasql Package
emp 테이블을 관리자(‘mgr’) 사원번호와 사원번호(‘empno’)를 기준으로 self join(셀프조인, 자체조인, 자체결합) 하여서 해당 관리자의 이름이 ‘Jones’인 사원을 선택한다.
Python Programming |
ps.sqldf("select e.empno, e.ename, m.ename MANAGER from emp e, emp m \
where e.mgr=m.empno and m.ename='JONES';")
Results |
empno | ename | MANAGER |
7788 | SCOTT | JONES |
7902 | FORD | JONES |
7. R data.table Package
emp 테이블에서 직원 이름이 ‘JONES’인 직원을 선택 후 이 테이블의 관리자(‘mgr’) 사원번호와 emp 테이블의 사원번호(‘empno’)를 기준으로 내부결합(Inner Join)을 수행하여서 해당 관리자의 이름이 ‘Jones’인 사원을 선택한다.
R Programming |
%%R
DT <- data.table(emp)
dept_DT <- data.table(dept)
DT[DT[ename=='JONES',], nomatch=NULL, on = .( mgr=empno ), .(empno,ename,i.ename)]
Results |
empno ename i.ename
1: 7788 SCOTT JONES
2: 7902 FORD JONES
emp 테이블의 관리자(‘mgr’) 사원번호와 emp 테이블의 사원번호(‘empno’)를 기준으로 self join을 수행하고, 해당 관리자의 이름이 ‘Jones’인 사원을 선택한다.
R Programming |
%%R
DT[DT, nomatch=NULL, on = .( mgr=empno ), .(empno,ename,i.ename)][i.ename=='JONES',]
Results |
empno ename i.ename
1: 7788 SCOTT JONES
2: 7902 FORD JONES
8. SAS Proc SQL
emp 테이블을 관리자(‘mgr’) 사원번호와 사원번호(‘empno’)를 기준으로 self join(셀프조인, 자체조인, 자체결합) 하여서 해당 관리자의 이름이 ‘Jones’인 사원을 선택한다.
SAS Programming |
%%SAS sas
PROC SQL;
CREATE TABLE STATSAS_1 AS
select e.empno, e.ename, m.ename as MANAGER
from emp e, emp m
where e.mgr = m.empno
and m.ename = 'JONES';
QUIT;
PROC PRINT;RUN;
Results |
empno | ename | MANAGER |
7788 | SCOTT | JONES |
7902 | FORD | JONES |
9. SAS Data Step
SAS Programming |
%%SAS sas
PROC SORT DATA=emp OUT=EMP_1(RENAME=( mgr = MGR_EMPNO ) );
BY mgr;
RUN;
PROC SORT DATA=emp OUT=EMP_2(RENAME=( empno = MGR_EMPNO ename = mrg_ename )
KEEP=empno ename) NODUPKEY;
BY empno;
RUN;
DATA STATSAS_2;
MERGE EMP_1(IN=A) EMP_2(IN=B);
BY MGR_EMPNO;
IF A AND B;
IF mrg_ename = 'JONES' THEN OUTPUT;
RUN;
PROC PRINT;RUN;
Results |
empno | ename | job | MGR_EMPNO | hiredate | sal | comm | deptno | mrg_ename |
7788 | SCOTT | ANALYST | 7566 | 1982-12-09 | 3000 | . | 20 | JONES |
7902 | FORD | ANALYST | 7566 | 1981-12-03 | 3000 | . | 20 | JONES |
10. Python Dfply Package
- inner_join : 56번/94번 참고
Python Programming |
@pipe
def inner_join_merge(df, other, left_on,right_on,suffixes=['_x','_y']):
joined = df.merge(other, how='inner', left_on=left_on,
right_on=right_on , suffixes=suffixes)
return joined
emp >> \
inner_join_merge( ( emp >> filter_by(X.ename=='JONES') ), left_on = ["mgr"], right_on = ["empno"] ) >> \
select(X.empno_x,X.ename_x, X.ename_y)
Results |
empno_x | ename_x | ename_y |
7788 | SCOTT | JONES |
7902 | FORD | JONES |
[SQL, Pandas, R Prog, Dplyr, SQLDF, PANDASQL, DATA.TABLE] SQL EMP 예제로 만나는 테이블 데이터 전처리 방법 리스트
댓글