포스팅 목차
128. Display those employees whose deptno is available in salary?
* [문제 변경] 사원번호(empno)가 관리자 사원번호(mgr) 에 존재하는 사원을 선택하시오.
- 파이썬 & R 패키지 호출 및 예제 데이터 생성 링크
- 유사문제 : 86 / 111번 참조
- [데이터 추출] 특정 조건을 만족하는 데이터 추출 - 비상관 서브쿼리(In), 중복 제거(Distinct)
- 데이터 전처리 - SQL, Pandas, R Prog, Dplyr, Dfply, SQLDF, PANDASQL, DATA.TABLE, SAS, Proc Sql
|
1. Oracle(오라클)
서브쿼리를 사용하여서 사원번호가 관리자 사원번호에 존재하는 직원들을 선택하여 관리자 역할을 수행하는 직원들의 정보를 출력한다.
Oracle Programming |
select ename,sal
from emp
where empno in (select distinct mgr from emp);
2. Python Pandas(파이썬)
사원번호(‘empno’) 를 emp테이블의 관리자(‘mgr’) 사원번호를 조회하여서 관리자(‘mgr’) 역할을 수행하는 직원들의 정보를 출력한다.
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 |
좀 더 명확하게 unique로 중복 제거한 사원번호를 조회 할 수 있다.
Python Programming |
emp[ emp['empno'].isin( list(emp['mgr'].unique()) )]
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)
사원번호(‘empno’) 를 대상으로 emp테이블의 관리자(‘mgr’) 사원번호를 조회하여서 관리자(‘mgr’) 역할을 수행하는 직원들의 정보를 출력한다.
R Programming |
%%R
emp[emp$empno %in% unlist(unique(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
사원번호(empno)가 관리자 사원번호(mgr)에 존재하는 직원들을 선택하여 관리자 역할을 수행하는 직원들의 정보를 출력한다.
R Programming |
%%R
emp %>% filter( empno %in% unlist(unique(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
5. R sqldf Package
서브쿼리를 사용하여서 사원번호가 관리자 사원번호에 존재하는 직원들을 선택하여 관리자 역할을 수행하는 직원들의 정보를 출력한다.
R Programming |
%%R
sqldf(" select ename,sal
from emp
where empno in (select distinct mgr from emp);")
Results |
ename sal
1 JONES 2975
2 BLAKE 2850
3 CLARK 2450
4 SCOTT 3000
5 KING 5000
6 FORD 3000
6. Python pandasql Package
서브쿼리를 사용하여서 사원번호가 관리자 사원번호에 존재하는 직원들을 선택하여 관리자 역할을 수행하는 직원들의 정보를 출력한다.
Python Programming |
ps.sqldf(" select ename,sal from emp where empno in (select distinct mgr from emp); ")
Results |
ename | sal | |
0 | JONES | 2975 |
1 | BLAKE | 2850 |
2 | CLARK | 2450 |
3 | SCOTT | 3000 |
4 | KING | 5000 |
5 | FORD | 3000 |
7. R data.table Package
emp테이블에서 관리자(‘mgr’) 사원번호를 조회하여서 관리자(‘mgr’) 역할을 수행하는 직원을 선택한다.
R Programming |
%%R
DT <- data.table(emp)
DT[ empno %in% unlist(unique(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 ename,sal,job
from emp
where empno in (select distinct mgr from emp);;
QUIT;
PROC PRINT;RUN;
Results |
OBS | ename | sal | job |
1 | JONES | 2975 | MANAGER |
2 | BLAKE | 2850 | MANAGER |
3 | CLARK | 2450 | MANAGER |
4 | SCOTT | 3000 | ANALYST |
5 | KING | 5000 | PRESIDEN |
6 | FORD | 3000 | ANALYST |
9. SAS Data Step
- DATA STEP(CROSS JOIN-카테시안 곱);
SAS Programming |
%%SAS sas
PROC SUMMARY DATA=EMP NWAY;
CLASS MGR;
VAR EMPNO;
OUTPUT OUT=MGR_CNT(DROP=_: RENAME=MGR=MGR_EMPNO) N=;
RUN;
DATA STATSAS_3;
SET MGR_CNT;
DO I=1 TO KOBS;
SET EMP NOBS=KOBS POINT=I;
IF EMPNO = MGR_EMPNO THEN OUTPUT;
END;
RUN;
PROC PRINT;RUN;
Results |
OBS | MGR_EMPNO | empno | ename | job | mgr | hiredate | sal | comm | deptno |
1 | 7566 | 7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975 | . | 20 |
2 | 7698 | 7698 | BLAKE | MANAGER | 7839 | 1981-03-01 | 2850 | . | 30 |
3 | 7782 | 7782 | CLARK | MANAGER | 7839 | 1981-01-09 | 2450 | . | 10 |
4 | 7788 | 7788 | SCOTT | ANALYST | 7566 | 1982-12-09 | 3000 | . | 20 |
5 | 7839 | 7839 | KING | PRESIDEN | . | 1981-11-17 | 5000 | . | 10 |
6 | 7902 | 7902 | FORD | ANALYST | 7566 | 1981-12-03 | 3000 | . | 20 |
10. Python Dfply Package
Python Programming |
emp >> filter_by( X.empno.isin(X.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 예제로 만나는 테이블 데이터 전처리 방법 리스트
댓글