포스팅 목차
150. Print the details of all the employees who are sub ordinate to Blake.
* 관리자 “BLAKE”가 관리하고 있는 부서원의 정보를 출력하시오.
- 파이썬 & R 패키지 호출 및 예제 데이터 생성 링크
- 유사문제 : 51, 52, 89번과 동일, 92, 107
- [데이터 추출] 특정 조건을 만족하는 데이터 추출 - 비상관 서브쿼리, 등가 데이터 결합
- 데이터 전처리 - SQL, Pandas, R Prog, Dplyr, Dfply, SQLDF, PANDASQL, DATA.TABLE, SAS, Proc Sql
|
1. Oracle(오라클)
서브쿼리에서 ‘BLAKE’의 사원번호(‘empno’)를 선택한 후 emp 테이블의 관리자 사원번호(‘mgr’)에서 “BLAKE”의 사원번호를 선택한다. 이를 통하여 “BLAKE”가 관리자로 근무하고 있는 부서원들의 정보를 추출한다.
Oracle Programming |
Select *
from emp
where mgr=(select empno from emp where ename='BLAKE');
emp 테이블을 self join 형식으로 관리자 사원번호(‘mgr’)와 사원번호(‘empno’)를 기준으로 내부조인을 실행하여 관리자 사원번호(‘mgr’)가 ‘BLAKE’의 사원번호와 동일한 사원정보를 추출한다. 이를 통하여 “BLAKE”가 관리자로 근무하고 있는 부서원들의 정보를 추출한다.
Oracle Programming |
select a.empno,a.ename ,b.ename
from emp a, emp b
where a.mgr = b.empno
and b.ename = 'BLAKE'
2. Python Pandas(파이썬)
관리자 사원번호(‘mgr’)가 “BLAKE”의 사원번호와 일치하는 직원 정보를 선택하여서 “BLAKE”가 관리자로 근무하고 있는 부서원들의 정보를 추출한다.
Python Programming |
emp[ ( emp['mgr'] == (emp[emp['ename']=='BLAKE']['empno'].tolist()[0]) ) ]
Results |
empno | ename | job | mgr | hiredate | sal | comm | deptno | |
1 | 7499 | ALLEN | SALESMAN | 7698.0 | 1981/02/20 | 1600 | 300.0 | 30 |
2 | 7521 | WARD | SALESMAN | 7698.0 | 1981/02/22 | 1250 | 500.0 | 30 |
4 | 7654 | MARTIN | SALESMAN | 7698.0 | 1981/09/28 | 1250 | 1400.0 | 30 |
9 | 7844 | TURNER | SALESMAN | 7698.0 | 1981/09/08 | 1500 | 0.0 | 30 |
11 | 7900 | JAMES | CLERK | 7698.0 | 1981/12/03 | 950 | NaN | 30 |
3. R Programming (R Package)
관리자 사원번호(‘mgr’)가 “BLAKE”의 사원번호와 일치하는 직원들의 정보를 선택하여서 “BLAKE”가 관리자로 근무하고 있는 부서원들의 정보를 추출한다.
R Programming |
%%R
emp[ (!is.na(emp$mgr)) & emp$mgr == unlist(emp[emp$ename == 'BLAKE', "empno" ]) ,]
Results |
# A tibble: 5 x 8
empno ename job mgr hiredate sal comm deptno
<dbl> <chr> <chr> <dbl> <date> <dbl> <dbl> <dbl>
1 7499 ALLEN SALESMAN 7698 1981-02-20 1600 300 30
2 7521 WARD SALESMAN 7698 1981-02-22 1250 500 30
3 7654 MARTIN SALESMAN 7698 1981-09-28 1250 1400 30
4 7844 TURNER SALESMAN 7698 1981-09-08 1500 0 30
5 7900 JAMES CLERK 7698 1981-12-03 950 NA 30
4. R Dplyr Package
dplyr::filter() 함수를 사용하여서 관리자 사원번호(‘mgr’)가 내부에서 선택한 “BLAKE”의 사원번호와 일치하는 직원들의 정보를 선택하여서 “BLAKE”가 관리자로 근무하고 있는 부서원들의 정보를 추출한다.
R Programming |
%%R
emp %>%
dplyr::filter( mgr == ( emp %>%
dplyr::filter( ename == 'BLAKE' ) %>%
dplyr::select(empno) %>%
unlist() )
)
Results |
# A tibble: 5 x 8
empno ename job mgr hiredate sal comm deptno
<dbl> <chr> <chr> <dbl> <date> <dbl> <dbl> <dbl>
1 7499 ALLEN SALESMAN 7698 1981-02-20 1600 300 30
2 7521 WARD SALESMAN 7698 1981-02-22 1250 500 30
3 7654 MARTIN SALESMAN 7698 1981-09-28 1250 1400 30
4 7844 TURNER SALESMAN 7698 1981-09-08 1500 0 30
5 7900 JAMES CLERK 7698 1981-12-03 950 NA 30
5. R sqldf Package
서브쿼리에서 ‘BLAKE’의 사원번호(‘empno’)를 선택한 후 emp 테이블의 관리자 사원번호(‘mgr’)에서 “BLAKE”의 사원번호를 선택한다. 이를 통하여 “BLAKE”가 관리자로 근무하고 있는 부서원들의 정보를 추출한다.
R Programming |
%%R
sqldf(" Select *
from emp
where mgr = (select empno from emp where ename='BLAKE');")
Results |
empno ename job mgr hiredate sal comm deptno
1 7499 ALLEN SALESMAN 7698 1981-02-20 1600 300 30
2 7521 WARD SALESMAN 7698 1981-02-22 1250 500 30
3 7654 MARTIN SALESMAN 7698 1981-09-28 1250 1400 30
4 7844 TURNER SALESMAN 7698 1981-09-08 1500 0 30
5 7900 JAMES CLERK 7698 1981-12-03 950 NA 30
emp 테이블을 self join 형식으로 관리자 사원번호(‘mgr’)와 사원번호(‘empno’)를 기준으로 내부조인을 실행하여 관리자 사원번호(‘mgr’)가 ‘BLAKE’의 사원번호와 동일한 사원정보를 추출한다. 이를 통하여 “BLAKE”가 관리자로 근무하고 있는 부서원들의 정보를 추출한다.
R Programming |
%%R
sqldf(" select a.empno,a.ename ,b.ename mgr_ename
from emp a, emp b
where a.mgr = b.empno
and b.ename = 'BLAKE'")
Results |
empno ename mgr_ename
1 7499 ALLEN BLAKE
2 7521 WARD BLAKE
3 7654 MARTIN BLAKE
4 7844 TURNER BLAKE
5 7900 JAMES BLAKE
6. Python pandasql Package
Python Programming |
ps.sqldf(" Select * from emp \
where mgr=(select empno from emp where ename='BLAKE');")
Results |
deptno | ename | job | mgr | hiredate | sal | comm | deptno | |
0 | 7499 | ALLEN | SALESMAN | 7698.0 | 1981/02/20 | 1600 | 300.0 | 30 |
1 | 7521 | WARD | SALESMAN | 7698.0 | 1981/02/22 | 1250 | 500.0 | 30 |
2 | 7654 | MARTIN | SALESMAN | 7698.0 | 1981/09/28 | 1250 | 1400.0 | 30 |
3 | 7844 | TURNER | SALESMAN | 7698.0 | 1981/09/08 | 1500 | 0.0 | 30 |
4 | 7900 | JAMES | CLERK | 7698.0 | 1981/12/03 | 950 | NaN | 30 |
Python Programming |
ps.sqldf(" select a.empno,a.ename ,b.ename mgr_ename \
from emp a, emp b where a.mgr=b.empno and b.ename='BLAKE';")
Results |
empno | ename | mgr_ename | |
0 | 7499 | ALLEN | BLAKE |
1 | 7521 | WARD | BLAKE |
2 | 7654 | MARTIN | BLAKE |
3 | 7844 | TURNER | BLAKE |
4 | 7900 | JAMES | BLAKE |
7. R data.table Package
1차로 ‘BLAKE’의 사원번호(‘empno’)를 선택한 후 emp 테이블의 관리자 사원번호(‘mgr’)에서 “BLAKE”의 사원번호에 해당하는 직원들의 정보를 선택한다. 이를 통하여 “BLAKE”가 관리자로 근무하고 있는 부서원들의 정보를 추출한다.
R Programming |
%%R
DT <- data.table(emp)
DT[ (mgr == DT[ename=='BLAKE', empno ]) , ]
Results |
empno ename job mgr hiredate sal comm deptno
1: 7499 ALLEN SALESMAN 7698 1981-02-20 1600 300 30
2: 7521 WARD SALESMAN 7698 1981-02-22 1250 500 30
3: 7654 MARTIN SALESMAN 7698 1981-09-28 1250 1400 30
4: 7844 TURNER SALESMAN 7698 1981-09-08 1500 0 30
5: 7900 JAMES CLERK 7698 1981-12-03 950 NA 30
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='BLAKE');
QUIT;
PROC PRINT;RUN;
Results |
OBS | empno | ename | job | mgr | hiredate | sal | comm | deptno |
1 | 7499 | ALLEN | SALESMAN | 7698 | 1981-02-20 | 1600 | 300 | 30 |
2 | 7521 | WARD | SALESMAN | 7698 | 1981-02-22 | 1250 | 500 | 30 |
3 | 7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 | 1250 | 1400 | 30 |
4 | 7844 | TURNER | SALESMAN | 7698 | 1981-09-08 | 1500 | 0 | 30 |
5 | 7900 | JAMES | CLERK | 7698 | 1981-12-03 | 950 | . | 30 |
SAS Programming |
%%SAS sas
PROC SQL;
CREATE TABLE STATSAS_2 AS
select a.empno,a.ename ,b.ename as mgr_ename
from emp a, emp b
where a.mgr = b.empno
and b.ename = 'BLAKE';
QUIT;
PROC PRINT;RUN;
Results |
OBS | empno | ename | mgr_ename |
1 | 7499 | ALLEN | BLAKE |
2 | 7521 | WARD | BLAKE |
3 | 7654 | MARTIN | BLAKE |
4 | 7844 | TURNER | BLAKE |
5 | 7900 | JAMES | BLAKE |
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 ename=mgr_ename) keep=empno ename) nodupkey;
by empno;
where ename = 'BLAKE';
run;
DATA STATSAS_2;
merge emp_1(in=a) emp_2(in=b);
by join_key;
if a and b;
RUN;
PROC PRINT;RUN;
Results |
OBS | empno | ename | job | join_key | hiredate | sal | comm | deptno | mgr_ename |
1 | 7499 | ALLEN | SALESMAN | 7698 | 1981-02-20 | 1600 | 300 | 30 | BLAKE |
2 | 7521 | WARD | SALESMAN | 7698 | 1981-02-22 | 1250 | 500 | 30 | BLAKE |
3 | 7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 | 1250 | 1400 | 30 | BLAKE |
4 | 7844 | TURNER | SALESMAN | 7698 | 1981-09-08 | 1500 | 0 | 30 | BLAKE |
5 | 7900 | JAMES | CLERK | 7698 | 1981-12-03 | 950 | . | 30 | BLAKE |
10. Python Dfply Package
Python Programming |
# [참고] 함수 사용. (52번 예제 참고)
@dfpipe
def pull_fun(df, column=-1):
return df.loc[:, column].item()
emp >> \
filter_by ( X.mgr == ( emp >> \
filter_by(X.ename == 'BLAKE') >>\
select(X.empno) >>\
pull_fun("empno")))
Results |
empno | ename | job | mgr | hiredate | sal | comm | deptno | |
1 | 7499 | ALLEN | SALESMAN | 7698.0 | 1981/02/20 | 1600 | 300.0 | 30 |
2 | 7521 | WARD | SALESMAN | 7698.0 | 1981/02/22 | 1250 | 500.0 | 30 |
4 | 7654 | MARTIN | SALESMAN | 7698.0 | 1981/09/28 | 1250 | 1400.0 | 30 |
9 | 7844 | TURNER | SALESMAN | 7698.0 | 1981/09/08 | 1500 | 0.0 | 30 |
11 | 7900 | JAMES | CLERK | 7698.0 | 1981/12/03 | 950 | NaN | 30 |
[SQL, Pandas, R Prog, Dplyr, SQLDF, PANDASQL, DATA.TABLE] SQL EMP 예제로 만나는 테이블 데이터 전처리 방법 리스트
댓글