포스팅 목차
152. Display those employees whose manger name is Jones and also with his manager name.
* 관리자의 이름이 ‘JONES’인 직원들의 정보와 ‘JONES’를 관리하고 있는 관리자의 정보를 함께 출력하시오.
- 파이썬 & R 패키지 호출 및 예제 데이터 생성 링크
- 유사문제 : 51/52/85/89/92/93/102, 89/150
- [데이터 추출] 특정 조건을 만족하는 데이터 추출 - 비상관 서브쿼리, 데이터 상하 결합(UNION)
- 데이터 전처리 (SQL, Pandas, R Prog, Dplyr, Dfply, SQLDF, PANDASQL, DATA.TABLE, SAS, Proc Sql)
|
1. Oracle(오라클)
1차로 서브쿼리에서 ‘JONES’의 사원번호(‘empno’)를 선택 후 emp 테이블의 관리자 사원번호(‘mgr’)에서 검색하여 ‘JONES’가 관리자로 근무하고 있는 담당 부서의 직원들 정보를 출력한다.
2차로 서브쿼리에서 ‘JONES’의 관리자 사원번호(‘mgr’)를 선택 후 emp 테이블의 사원번호(‘empno’)에서 검색하여 ‘JONES’를 관리하고 있는 담당 관리자의 정보를 출력한다.
앞의 2개 결과를 UNION으로 상하결합하여 출력한다.
Oracle Programming |
Select * from emp where mgr =(select empno from emp where ename='JONES')
union
select * from emp where empno=(select mgr from emp where ename='JONES');
2. Python Pandas(파이썬)
emp테이블의 관리자 사원번호(‘mgr’)에서 ‘JONES’의 사원번호를 선택하여서 ‘JONES’가 관리자로 근무하고 있는 담당 부서의 직원 정보 또는 emp 테이블의 사원번호(‘empno’)에서 ‘JONES’를 담당하고 있는 관리자 사원번호를 검색하여 ‘JONES’의 담당 관리자의 직원 정보를 함께 출력한다.
Python Programming |
emp[ (emp['mgr']== (emp[emp['ename'] == 'JONES']['empno'].iloc[0]) ) | (emp['empno']== (emp[emp['ename'] == 'JONES']['mgr'].iloc[0]) ) ]
Results |
empno | ename | job | mgr | hiredate | sal | comm | deptno | |
7 | 7788 | SCOTT | ANALYST | 7566.0 | 1982/12/09 | 3000 | NaN | 20 |
8 | 7839 | KING | PRESIDENT | NaN | 1981/11/17 | 5000 | NaN | 10 |
12 | 7902 | FORD | ANALYST | 7566.0 | 1981/12/03 | 3000 | NaN | 20 |
3. R Programming (R Package)
emp테이블의 관리자 사원번호(‘mgr’)에서 ‘JONES’의 사원번호를 선택하여서 ‘JONES’가 관리자로 근무하고 있는 담당 부서의 직원이거나, emp 테이블의 사원번호(‘empno’)에서 ‘JONES’를 담당하고 있는 관리자 사원번호를 검색하여 ‘JONES’의 담당 관리자에 해당하는 경우에 정보를 출력한다.
R Programming |
%%R
emp[ (emp$mgr %in% emp[emp$ename == 'JONES', c("empno") ]$empno) | (emp$empno %in% emp[emp$ename == 'JONES', c("mgr") ]$mgr), ]
Results |
# A tibble: 3 x 8
empno ename job mgr hiredate sal comm deptno
<dbl> <chr> <chr> <dbl> <date> <dbl> <dbl> <dbl>
1 7788 SCOTT ANALYST 7566 1982-12-09 3000 NA 20
2 7839 KING PRESIDENT NA 1981-11-17 5000 NA 10
3 7902 FORD ANALYST 7566 1981-12-03 3000 NA 20
4. R Dplyr Package
emp테이블의 관리자 사원번호(‘mgr’)에서 ‘JONES’의 사원번호를 선택하여서 ‘JONES’가 관리자로 근무하고 있는 담당 부서의 직원이거나, emp 테이블의 사원번호(‘empno’)에서 ‘JONES’를 담당하고 있는 관리자 사원번호를 검색하여 ‘JONES’의 담당 관리자에 해당하는 경우에 정보를 출력한다.
R Programming |
%%R
emp %>% dplyr::filter( (mgr == ( emp %>%
dplyr::filter(ename == "JONES") %>%
dplyr::select(empno) %>%
pull(empno)) )
|
(empno == ( emp %>%
dplyr::filter(ename == "JONES") %>%
dplyr::select(mgr) %>%
pull(mgr)) )
)
Results |
# A tibble: 3 x 8
empno ename job mgr hiredate sal comm deptno
<dbl> <chr> <chr> <dbl> <date> <dbl> <dbl> <dbl>
1 7788 SCOTT ANALYST 7566 1982-12-09 3000 NA 20
2 7839 KING PRESIDENT NA 1981-11-17 5000 NA 10
3 7902 FORD ANALYST 7566 1981-12-03 3000 NA 20
5. R sqldf Package
1차로 서브쿼리에서 ‘JONES’의 사원번호(‘empno’)를 선택 후 emp 테이블의 관리자 사원번호(‘mgr’)에서 검색하여 ‘JONES’가 관리자로 근무하고 있는 담당 부서의 직원들 정보를 출력한다.
2차로 서브쿼리에서 ‘JONES’의 관리자 사원번호(‘mgr’)를 선택 후 emp 테이블의 사원번호(‘empno’)에서 검색하여 ‘JONES’를 관리하고 있는 담당 관리자의 정보를 출력한다.
앞의 2개 결과를 UNION ALL 연산자로 상하결합하여 출력한다.
R Programming |
%%R
sqldf(" select e.* from emp e,emp e1 where e.mgr=e1.empno and e1.ename='JONES'
union all
select e1.* from emp e,emp e1 where e.mgr=e1.empno and e.ename='JONES';")
empno ename job mgr hiredate sal comm deptno
1 7788 SCOTT ANALYST 7566 1982-12-09 3000 NA 20
2 7902 FORD ANALYST 7566 1981-12-03 3000 NA 20
3 7839 KING PRESIDENT NA 1981-11-17 5000 NA 10
6. Python pandasql Package
Python Programming |
ps.sqldf(" Select * from emp where mgr=(select empno from emp where ename='JONES') \
union all \
select * from emp where empno=(select mgr from emp where ename='JONES');")
Results |
empno | ename | job | mgr | hiredate | sal | comm | deptno | |
0 | 7788 | SCOTT | ANALYST | 7566.0 | 1982/12/09 | 3000 | None | 20 |
1 | 7902 | FORD | ANALYST | 7566.0 | 1981/12/03 | 3000 | None | 20 |
2 | 7839 | KING | PRESIDENT | NaN | 1981/11/17 | 5000 | None | 10 |
7. R data.table Package
emp테이블의 관리자 사원번호(‘mgr’)에서 ‘JONES’의 사원번호를 선택하여서 ‘JONES’가 관리자로 근무하고 있는 담당 부서의 직원이거나, emp 테이블의 사원번호(‘empno’)에서 ‘JONES’를 담당하고 있는 관리자 사원번호를 검색하여 ‘JONES’의 담당 관리자에 해당하는 경우에 정보를 출력한다.
R Programming |
%%R
DT <- data.table(emp)
# setkey(DT, deptno)
# setkey(dept_DT, deptno)
DT[ (DT[,mgr == ( DT[ename == "JONES", .(empno)]$empno )]) | (DT[,empno == ( DT[ename == "JONES", .(mgr)]$mgr )]) , ]
Results |
empno ename job mgr hiredate sal comm deptno
1: 7788 SCOTT ANALYST 7566 1982-12-09 3000 NA 20
2: 7839 KING PRESIDENT NA 1981-11-17 5000 NA 10
3: 7902 FORD ANALYST 7566 1981-12-03 3000 NA 20
8. SAS Proc SQL
SAS Programming |
%%SAS sas
PROC SQL;
CREATE TABLE STATSAS_1 AS
Select * from emp where mgr =(select empno from emp where ename='JONES')
union
select * from emp where empno=(select mgr from emp where ename='JONES');
QUIT;
PROC PRINT;RUN;
Results |
OBS | empno | ename | job | mgr | hiredate | sal | comm | deptno |
1 | 7788 | SCOTT | ANALYST | 7566 | 1982-12-09 | 3000 | . | 20 |
2 | 7839 | KING | PRESIDEN | . | 1981-11-17 | 5000 | . | 10 |
3 | 7902 | FORD | ANALYST | 7566 | 1981-12-03 | 3000 | . | 20 |
9. SAS Data Step
SAS Programming |
%%SAS sas
proc sort data=emp out=emp_1(rename=mgr=join_key);
by mgr;
run;
proc sort data=emp out=emp_2(rename=empno=join_key keep=empno) nodupkey;
by empno;
where ename='JONES';
run;
DATA STATSAS_2;
merge emp_1(in=a) emp_2(in=b);
by join_key;
if a and b;
RUN;
proc sort data=emp out=emp_3(rename=empno=join_key);
by empno;
run;
proc sort data=emp out=emp_4(rename=mgr=join_key keep=mgr) nodupkey;
by mgr;
where ename='JONES';
run;
DATA STATSAS_3;
merge emp_3(in=a) emp_4(in=b);
by join_key;
if a and b;
RUN;
data STATSAS_4;
set STATSAS_2(rename=join_key=mgr)
STATSAS_3(rename=join_key=empno);
run;
PROC PRINT;RUN;
Results |
OBS | empno | ename | job | mgr | hiredate | sal | comm | deptno |
1 | 7788 | SCOTT | ANALYST | 7566 | 1982-12-09 | 3000 | . | 20 |
2 | 7902 | FORD | ANALYST | 7566 | 1981-12-03 | 3000 | . | 20 |
3 | 7839 | KING | PRESIDEN | . | 1981-11-17 | 5000 | . | 10 |
10. Python Dfply Package
Python Programming |
emp >> \
filter_by( ( ( X.mgr == ( emp >>
filter_by(X.ename=="JONES") >>
select(X.empno) >>
pull_fun("empno")) )
|
( X.empno == ( emp >>
filter_by(X.ename=="JONES") >>
select(X.mgr) >>
pull_fun("mgr")) )
) )
Results |
empno | ename | job | mgr | hiredate | sal | comm | deptno | |
7 | 7788 | SCOTT | ANALYST | 7566.0 | 1982/12/09 | 3000 | NaN | 20 |
8 | 7839 | KING | PRESIDENT | NaN | 1981/11/17 | 5000 | NaN | 10 |
12 | 7902 | FORD | ANALYST | 7566.0 | 1981/12/03 | 3000 | NaN | 20 |
[SQL, Pandas, R Prog, Dplyr, SQLDF, PANDASQL, DATA.TABLE] SQL EMP 예제로 만나는 테이블 데이터 전처리 방법 리스트
댓글