포스팅 목차
137. Display those employees who are working as manager?
* 관리자 역할을 수행하고 있는 직원들을 출력하시오.
- 파이썬 & R 패키지 호출 및 예제 데이터 생성 링크
- 유사문제 : 23번 / 86번 / 111번 / 120번(Merge 방식 포함) / 128번(Unique구문 추가)
- [데이터 추출] 특정 조건을 만족하는 데이터 추출 - 비상관 서브쿼리(In), 중복 제거(Distinct)
- 데이터 전처리 - SQL, Pandas, R Prog, Dplyr, Dfply, SQLDF, PANDASQL, DATA.TABLE, SAS, Proc Sql
|
1. Oracle(오라클)
서브쿼리를 통하여 emp테이블의 관리자 사원번호(‘mgr’)에 명단이 존재하는 사원번호(‘empno’)를 선택한다.
Oracle Programming |
select *
from emp
where empno in (select mgr from emp);
emp테이블에서 관리자 사원번호의 중복을 제거 후 emp 테이블과 다시 self join 형식으로 조인하여서 관리자 사원번호에 존재하는 직원의 이름을 출력한다.
Oracle Programming |
SELECT a.*
FROM emp a , ( select distinct mgr from emp ) b
WHERE a.EMPNO = b.MGR
2. Python Pandas(파이썬)
isin 함수를 사용하여 emp테이블의 관리자 사원번호(‘mgr’)에 명단이 존재하는 사원번호(‘empno’)를 선택한다.
Python Programming |
emp[ emp['empno'].isin(emp['mgr']) ]
Results |
empno | ename | job | mgr | hiredate | sal | comm | deptno | |
3 | 7566 | JONES | MANAGER | 7839.0 | 1981/04/02 | 2975 | NaN | 20 |
5 | 7698 | BLAKE | MANAGER | 7839.0 | 1981/03/01 | 2850 | NaN | 30 |
6 | 7782 | CLARK | MANAGER | 7839.0 | 1981/01/09 | 2450 | NaN | 10 |
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)
%in% 함수를 사용하여 emp테이블의 관리자 사원번호(‘mgr’)에 명단이 존재하는 사원번호(‘empno’)를 선택한다.
R Programming |
%%R
emp[ emp$empno %in% unlist(emp$mgr) , ]
Results |
# A tibble: 6 x 8
empno ename job mgr hiredate sal comm deptno
<dbl> <chr> <chr> <dbl> <date> <dbl> <dbl> <dbl>
1 7566 JONES MANAGER 7839 1981-04-02 2975 NA 20
2 7698 BLAKE MANAGER 7839 1981-03-01 2850 NA 30
3 7782 CLARK MANAGER 7839 1981-01-09 2450 NA 10
4 7788 SCOTT ANALYST 7566 1982-12-09 3000 NA 20
5 7839 KING PRESIDENT NA 1981-11-17 5000 NA 10
6 7902 FORD ANALYST 7566 1981-12-03 3000 NA 20
4. R Dplyr Package
%in% 함수를 사용하여 emp테이블의 관리자 사원번호(‘mgr’)에 명단이 존재하는 사원번호(‘empno’)를 선택 후 filter 함수를 통하여 선택된 사원들의 정보를 출력한다.
R Programming |
%%R
emp %>%
dplyr::filter( empno %in% ( emp %>% dplyr::select(mgr) %>% unlist() ) )
Results |
# A tibble: 6 x 8
empno ename job mgr hiredate sal comm deptno
<dbl> <chr> <chr> <dbl> <date> <dbl> <dbl> <dbl>
1 7566 JONES MANAGER 7839 1981-04-02 2975 NA 20
2 7698 BLAKE MANAGER 7839 1981-03-01 2850 NA 30
3 7782 CLARK MANAGER 7839 1981-01-09 2450 NA 10
4 7788 SCOTT ANALYST 7566 1982-12-09 3000 NA 20
5 7839 KING PRESIDENT NA 1981-11-17 5000 NA 10
6 7902 FORD ANALYST 7566 1981-12-03 3000 NA 20
5. R sqldf Package
서브쿼리를 통하여 emp테이블의 관리자 사원번호(‘mgr’)에 명단이 존재하는 사원번호(‘empno’)를 선택한다.
R Programming |
%%R
sqldf(" select *
from emp
where empno in(select mgr from emp);")
Results |
empno ename job mgr hiredate sal comm deptno
1 7566 JONES MANAGER 7839 1981-04-02 2975 NA 20
2 7698 BLAKE MANAGER 7839 1981-03-01 2850 NA 30
3 7782 CLARK MANAGER 7839 1981-01-09 2450 NA 10
4 7788 SCOTT ANALYST 7566 1982-12-09 3000 NA 20
5 7839 KING PRESIDENT NA 1981-11-17 5000 NA 10
6 7902 FORD ANALYST 7566 1981-12-03 3000 NA 20
emp테이블에서 관리자 사원번호의 중복을 제거 후 emp 테이블과 다시 self join 형식으로 조인하여서 관리자 사원번호에 존재하는 직원의 이름을 출력한다.
R Programming |
%%R
sqldf(" SELECT a.*
FROM emp a , ( select distinct mgr from emp ) b
WHERE a.EMPNO = b.MGR ")
Results |
empno ename job mgr hiredate sal comm deptno
1 7566 JONES MANAGER 7839 1981-04-02 2975 NA 20
2 7698 BLAKE MANAGER 7839 1981-03-01 2850 NA 30
3 7782 CLARK MANAGER 7839 1981-01-09 2450 NA 10
4 7788 SCOTT ANALYST 7566 1982-12-09 3000 NA 20
5 7839 KING PRESIDENT NA 1981-11-17 5000 NA 10
6 7902 FORD ANALYST 7566 1981-12-03 3000 NA 20
6. Python pandasql Package
Python Programming |
import copy
ps.sqldf(" select * from emp where empno in(select mgr from emp); ")
Results |
empno | ename | job | mgr | hiredate | sal | comm | deptno | |
0 | 7566 | JONES | MANAGER | 7839.0 | 1981/04/02 | 2975 | None | 20 |
1 | 7698 | BLAKE | MANAGER | 7839.0 | 1981/03/01 | 2850 | None | 30 |
2 | 7782 | CLARK | MANAGER | 7839.0 | 1981/01/09 | 2450 | None | 10 |
3 | 7788 | SCOTT | ANALYST | 7566.0 | 1982/12/09 | 3000 | None | 20 |
4 | 7839 | KING | PRESIDENT | NaN | 1981/11/17 | 5000 | None | 10 |
5 | 7902 | FORD | ANALYST | 7566.0 | 1981/12/03 | 3000 | None | 20 |
7. R data.table Package
%in% 함수를 통하여 emp테이블의 관리자 사원번호(‘mgr’)에 명단이 존재하는 사원번호(‘empno’)를 선택한다.
R Programming |
%%R
DT <- data.table(emp)
DT[ empno %in% DT[,mgr],]
Results |
empno ename job mgr hiredate sal comm deptno
1: 7566 JONES MANAGER 7839 1981-04-02 2975 NA 20
2: 7698 BLAKE MANAGER 7839 1981-03-01 2850 NA 30
3: 7782 CLARK MANAGER 7839 1981-01-09 2450 NA 10
4: 7788 SCOTT ANALYST 7566 1982-12-09 3000 NA 20
5: 7839 KING PRESIDENT NA 1981-11-17 5000 NA 10
6: 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 empno in (select mgr from emp);;
QUIT;
PROC PRINT;RUN;
Results |
OBS | empno | ename | job | mgr | hiredate | sal | comm | deptno |
1 | 7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975 | . | 20 |
2 | 7698 | BLAKE | MANAGER | 7839 | 1981-03-01 | 2850 | . | 30 |
3 | 7782 | CLARK | MANAGER | 7839 | 1981-01-09 | 2450 | . | 10 |
4 | 7788 | SCOTT | ANALYST | 7566 | 1982-12-09 | 3000 | . | 20 |
5 | 7839 | KING | PRESIDEN | . | 1981-11-17 | 5000 | . | 10 |
6 | 7902 | FORD | ANALYST | 7566 | 1981-12-03 | 3000 | . | 20 |
SAS Programming |
%%SAS sas
PROC SQL;
create table STATSAS_2 as
SELECT a.*
FROM emp a , ( select distinct mgr from emp ) b
WHERE a.EMPNO = b.MGR;
QUIT;
PROC PRINT;RUN;
Results |
OBS | empno | ename | job | mgr | hiredate | sal | comm | deptno |
1 | 7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975 | . | 20 |
2 | 7698 | BLAKE | MANAGER | 7839 | 1981-03-01 | 2850 | . | 30 |
3 | 7782 | CLARK | MANAGER | 7839 | 1981-01-09 | 2450 | . | 10 |
4 | 7788 | SCOTT | ANALYST | 7566 | 1982-12-09 | 3000 | . | 20 |
5 | 7839 | KING | PRESIDEN | . | 1981-11-17 | 5000 | . | 10 |
6 | 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=EMPNO=JOIN_KEY);
BY EMPNO;
RUN;
PROC SORT DATA = EMP OUT=EMP_DUP(RENAME=MGR=JOIN_KEY) NODUPKEY;
BY MGR;
RUN;
DATA STATSAS_2;
MERGE EMP_1(IN=A) EMP_DUP(IN=B);
BY JOIN_KEY;
IF A AND B;
RUN;
PROC PRINT;RUN;
Results |
OBS | JOIN_KEY | ename | job | mgr | hiredate | sal | comm | deptno | empno |
1 | 7566 | SCOTT | ANALYST | 7839 | 1982-12-09 | 3000 | . | 20 | 7788 |
2 | 7698 | ALLEN | SALESMAN | 7839 | 1981-02-20 | 1600 | 300 | 30 | 7499 |
3 | 7782 | MILLER | CLERK | 7839 | 1982-01-23 | 1300 | . | 10 | 7934 |
4 | 7788 | ADAMS | CLERK | 7566 | 1983-01-12 | 1100 | . | 20 | 7876 |
5 | 7839 | JONES | MANAGER | . | 1981-04-02 | 2975 | . | 20 | 7566 |
6 | 7902 | SMITH | CLERK | 7566 | 1980-12-17 | 800 | . | 20 | 7369 |
10. R dtplyr Package(data.table)
%in% 함수를 사용하여 emp테이블의 관리자 사원번호(‘mgr’)에 명단이 존재하는 사원번호(‘empno’)를 선택 후 filter 함수를 통하여 선택된 사원들의 정보를 출력한다.
R Programming |
%%R
# library(dplyr, warn.conflicts = FALSE)
lazy_emp <- lazy_dt(emp)
lazy_emp %>%
filter( empno %in% ( lazy_emp %>% select(mgr) %>% unlist() ) )
Results |
Source: local data table [?? x 8]
Call: `_DT11`[empno %in% (lazy_emp %>% select(mgr) %>% unlist())]
empno ename job mgr hiredate sal comm deptno
<dbl> <chr> <chr> <dbl> <date> <dbl> <dbl> <dbl>
1 7369 SMITH CLERK 7902 1980-12-17 800 NA 20
2 7499 ALLEN SALESMAN 7698 1981-02-20 1600 300 30
3 7521 WARD SALESMAN 7698 1981-02-22 1250 500 30
4 7566 JONES MANAGER 7839 1981-04-02 2975 NA 20
5 7654 MARTIN SALESMAN 7698 1981-09-28 1250 1400 30
6 7698 BLAKE MANAGER 7839 1981-03-01 2850 NA 30
# Use as.data.table()/as.data.frame()/as_tibble() to access results
11. R tidytable Package(data.table)
%in% 함수를 사용하여 emp테이블의 관리자 사원번호(‘mgr’)에 명단이 존재하는 사원번호(‘empno’)를 선택 후 filter 함수를 통하여 선택된 사원들의 정보를 출력한다.
R Programming |
%%R
DT <- data.table(emp)
DT %>% tidytable::filter.(empno %in% ( DT %>% select.(mgr) %>% unlist() ))
Results |
# tidytable [6 x 8]
empno ename job mgr hiredate sal comm deptno
<dbl> <chr> <chr> <dbl> <date> <dbl> <dbl> <dbl>
1 7566 JONES MANAGER 7839 1981-04-02 2975 NA 20
2 7698 BLAKE MANAGER 7839 1981-03-01 2850 NA 30
3 7782 CLARK MANAGER 7839 1981-01-09 2450 NA 10
4 7788 SCOTT ANALYST 7566 1982-12-09 3000 NA 20
5 7839 KING PRESIDENT NA 1981-11-17 5000 NA 10
6 7902 FORD ANALYST 7566 1981-12-03 3000 NA 20
12. Python dfply Package(파이썬)
isin 함수를 사용하여 emp테이블의 관리자 사원번호(‘mgr’)에 명단이 존재하는 사원번호(‘empno’)를 선택 후 row_slice 함수를 통하여 선택된 사원들의 정보를 출력한다.
Python Programming |
emp >> \
row_slice( X.empno.isin( (emp >> select(X.mgr))['mgr'] ))
Results |
empno | ename | job | mgr | hiredate | sal | comm | deptno | |
3 | 7566 | JONES | MANAGER | 7839.0 | 1981/04/02 | 2975 | NaN | 20 |
5 | 7698 | BLAKE | MANAGER | 7839.0 | 1981/03/01 | 2850 | NaN | 30 |
6 | 7782 | CLARK | MANAGER | 7839.0 | 1981/01/09 | 2450 | NaN | 10 |
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 |
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")))
Results |
empno | ename | job | mgr | hiredate | sal | comm | deptno | |
3 | 7566 | JONES | MANAGER | 7839.0 | 1981/04/02 | 2975 | NaN | 20 |
5 | 7698 | BLAKE | MANAGER | 7839.0 | 1981/03/01 | 2850 | NaN | 30 |
6 | 7782 | CLARK | MANAGER | 7839.0 | 1981/01/09 | 2450 | NaN | 10 |
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 예제로 만나는 테이블 데이터 전처리 방법 리스트
댓글