포스팅 목차
85. Display the details of employees who are in sales dept and grade is 3.
* 영업부서(Salses - ‘30’)에 근무하는 직원 중에서 판매 급여 등급이 3등급인 직원의 정보를 출력하시오.
- 파이썬 & R 패키지 호출 및 예제 데이터 생성 링크
- [테이블 결합] LEFT JOIN (왼쪽 결합) 으로 2개 테이블 결합 - 왼쪽 테이블을 기준으로 오른쪽 테이블에 존재하지 않는 데이터 추출
|
1. Oracle(오라클)
emp 테이블의 급여(‘sal’)에 대하여 판매급여(‘SALGRADE’) 테이블을 조회하여서 판매 등급이 3등급에 해당하는 직원을 선택하고, 이 직원들의 부서번호(‘deptno’)를 부서 정보(‘DEPT’) 테이블에서 조회하여서 부서이름(‘dname’)이 영업부서(‘SALSE’)에 해당하는 부서코드(‘30’)에 근무하는 직원의 정보를 선택한다.
Oracle Programming |
select *
from emp
where sal >= (select losal from salgrade where grade=3)
and sal <= (select hisal from salgrade where grade=3)
and deptno = (select deptno from dept where dname='SALES');
2. Python Pandas(파이썬)
- 판매급여(‘SALGRADE’) 테이블에서 판매 등급(‘grade’) 3등급의 하한값을 조회한다.
Python Programming |
print( type(salgrade[salgrade['grade']==3]['losal'].tolist()[0]) )
salgrade[salgrade['grade']==3]['losal'].tolist()[0]
Results |
<class 'int'>
1401
Python Programming |
print( type(salgrade[salgrade['grade']==3][['losal']].iloc[0,0]) )
type(salgrade[salgrade['grade']==3][['losal']].iloc[0,0])
Results |
<class 'numpy.int64'>
numpy.int64
emp 테이블의 급여(‘sal’)에 대하여 판매급여(‘SALGRADE’) 테이블을 조회하여서 판매 등급이 3등급에 해당하는 직원을 선택하고, 이 직원들의 부서번호(‘deptno’)를 부서 정보(‘DEPT’) 테이블에서 조회하여서 부서이름(‘dname’)이 영업부서(‘SALSE’)에 해당하는 부서코드(‘30’)에 근무하는 직원의 정보를 선택한다.
Python Programming |
emp[ ( emp['sal'] >= (salgrade[salgrade['grade']==3]['losal'].tolist()[0]) ) &
( emp['sal'] <= (salgrade[salgrade['grade']==3][['hisal']].iloc[0,0]) ) &
( emp['deptno'] == (dept[dept['dname']=='SALES'][['deptno']].iloc[0,0]) ) ]
Results |
empno | ename | job | mgr | hiredate | sal | comm | deptno | |
1 | 7499 | ALLEN | SALESMAN | 7698.0 | 1981/02/20 | 1600 | 300.0 | 30 |
9 | 7844 | TURNER | SALESMAN | 7698.0 | 1981/09/08 | 1500 | 0.0 | 30 |
3. R Programming (R Package)
emp 테이블의 급여(‘sal’)에 대하여 판매급여(‘SALGRADE’) 테이블을 조회하여서 판매 등급이 3등급에 해당하는 직원을 선택하고, 이 직원들의 부서번호(‘deptno’)를 부서 정보(‘DEPT’) 테이블에서 조회하여서 부서이름(‘dname’)이 영업부서(‘SALSE’)에 해당하는 부서코드(‘30’)에 근무하는 직원의 정보를 선택한다.
R Programming |
%%R
emp[ (emp$sal >= unlist(salgrade[salgrade$grade == 3, "losal" ])) &
(emp$sal <= unlist(salgrade[salgrade$grade == 3, "hisal" ])) &
(emp$deptno == unlist(dept[dept$dname =='SALES', "deptno" ]))
,]
Results |
# A tibble: 2 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 7844 TURNER SALESMAN 7698 1981-09-08 1500 0 30
4. R Dplyr Package
emp 테이블의 급여(‘sal’)에 대하여 판매급여(‘SALGRADE’) 테이블을 조회하여서 판매 등급이 3등급에 해당하는 직원을 선택하고, 이 직원들의 부서번호(‘deptno’)를 부서 정보(‘DEPT’) 테이블에서 조회하여서 부서이름(‘dname’)이 영업부서(‘SALES’)에 해당하는 부서코드(‘30’)에 근무하는 직원의 정보를 선택한다.
- 1차 : 급여(‘sal’)가 판매급여(‘SALGRADE’) 테이블에서 판매 등급(‘grade’) 3등급의 하한값과 상한값에 포함되는 직원을 선택
- 2차 : 부서번호(‘deptno’)가 부서정보(‘DEPT’) 테이블에서 영업부서(‘SALES’)를 선택
R Programming |
%%R
emp %>%
dplyr::filter( sal >= ( salgrade %>% dplyr::filter( grade == 3 ) %>% dplyr::select(losal) %>% unlist() ) &
sal <= ( salgrade %>% dplyr::filter( grade == 3 ) %>% dplyr::select(hisal) %>% unlist() ) &
deptno == ( dept %>% dplyr::filter( dname == 'SALES' ) %>% dplyr::select(deptno) %>% unlist() )
)
Results |
# A tibble: 2 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 7844 TURNER SALESMAN 7698 1981-09-08 1500 0 30
5. R sqldf Package
emp 테이블의 급여(‘sal’)에 대하여 판매급여(‘SALGRADE’) 테이블을 조회하여서 판매 등급이 3등급에 해당하는 직원을 선택하고, 이 직원들의 부서번호(‘deptno’)를 부서 정보(‘DEPT’) 테이블에서 조회하여서 부서이름(‘dname’)이 영업부서(‘SALSE’)에 해당하는 부서코드(‘30’)에 근무하는 직원의 정보를 선택한다.
R Programming |
%%R
sqldf("select *
from emp
where sal >=(select losal from salgrade where grade=3)
and sal <=(select hisal from salgrade where grade=3)
and deptno =(select deptno from dept where dname='SALES');")
Results |
empno ename job mgr hiredate sal comm deptno
1 7499 ALLEN SALESMAN 7698 1981-02-20 1600 300 30
2 7844 TURNER SALESMAN 7698 1981-09-08 1500 0 30
6. Python pandasql Package
emp 테이블의 급여(‘sal’)에 대하여 판매급여(‘SALGRADE’) 테이블을 조회하여서 판매 등급이 3등급에 해당하는 직원을 선택하고, 이 직원들의 부서번호(‘deptno’)를 부서 정보(‘DEPT’) 테이블에서 조회하여서 부서이름(‘dname’)이 영업부서(‘SALSE’)에 해당하는 부서코드(‘30’)에 근무하는 직원의 정보를 선택한다.
Python Programming |
ps.sqldf("select * \
from emp \
where sal >=(select losal from salgrade where grade=3) \
and sal <=(select hisal from salgrade where grade=3) \
and deptno =(select deptno from dept where dname='SALES'); ")
Results |
empno | ename | job | mgr | hiredate | sal | comm | deptno | |
0 | 7499 | ALLEN | SALESMAN | 7698.0 | 1981/02/20 | 1600 | 300.0 | 30 |
1 | 7844 | TURNER | SALESMAN | 7698.0 | 1981/09/08 | 1500 | 0.0 | 30 |
7. R data.table Package
emp 테이블의 급여(‘sal’)에 대하여 판매급여(‘SALGRADE’) 테이블을 조회하여서 판매 등급이 3등급에 해당하는 직원을 선택하고, 이 직원들의 부서번호(‘deptno’)를 부서 정보(‘DEPT’) 테이블에서 조회하여서 부서이름(‘dname’)이 영업부서(‘SALSE’)에 해당하는 부서코드(‘30’)에 근무하는 직원의 정보를 선택한다.
R Programming |
%%R
DT <- data.table(emp)
dept_DT <- data.table(dept)
salgrade_DT <- data.table(salgrade)
DT[ (sal >= salgrade_DT[grade==3, losal ]) &
(sal <= salgrade_DT[grade==3, hisal ]) &
(deptno = dept_DT[dname=='SALES', deptno ]) , ]
Results |
empno ename job mgr hiredate sal comm deptno
1: 7499 ALLEN SALESMAN 7698 1981-02-20 1600 300 30
2: 7844 TURNER SALESMAN 7698 1981-09-08 1500 0 30
8. SAS Proc SQL
emp 테이블의 급여(‘sal’)에 대하여 판매급여(‘SALGRADE’) 테이블을 조회하여서 판매 등급이 3등급에 해당하는 직원을 선택하고, 이 직원들의 부서번호(‘deptno’)를 부서 정보(‘DEPT’) 테이블에서 조회하여서 부서이름(‘dname’)이 영업부서(‘SALSE’)에 해당하는 부서코드(‘30’)에 근무하는 직원의 정보를 선택한다.
SAS Programming |
%%SAS sas
PROC SQL;
CREATE TABLE STATSAS_1 AS
select *
from emp
where sal >= (select losal from salgrade where grade=3)
and sal <= (select hisal from salgrade where grade=3)
and deptno = (select deptno from dept where dname='SALES');
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 | 7844 | TURNER | SALESMAN | 7698 | 1981-09-08 | 1500 | 0 | 30 |
9. SAS Data Step
- SALGRADE와 DEPT에서 반환되는 값이 1건이어서 아래와 같이 처리;
SAS Programming |
%%SAS sas
DATA STATSAS_2;
SET salgrade( keep=losal grade where=(grade=3));
SET salgrade( keep=hisal grade where=(grade=3));
SET dept ( keep=deptno dname where=(dname='SALES') rename=deptno=dept_no);
DO I=1 TO KOBS;
SET emp NOBS=KOBS POINT=I;
IF SAL >= LOSAL AND SAL <= HISAL AND DEPTNO = DEPT_NO THEN output;
END;
DROP DEPT_NO;
RUN;
PROC PRINT;RUN;
Results |
OBS | grade | losal | hisal | dname | empno | ename | job | mgr | hiredate | sal | comm | deptno |
1 | 3 | 1401 | 2000 | SALES | 7499 | ALLEN | SALESMAN | 7698 | 1981-02-20 | 1600 | 300 | 30 |
2 | 3 | 1401 | 2000 | SALES | 7844 | TURNER | SALESMAN | 7698 | 1981-09-08 | 1500 | 0 | 30 |
- Macro 할당 방식
SAS Programming |
%%SAS sas
proc sql noprint;
select losal, hisal into :losal, :hisal
from salgrade
where grade=3;
quit;
proc sql noprint;
select deptno into :deptno
from dept
where dname='SALES';
quit;
%put TNote: losal = &losal;
%put TNote: hisal = &hisal;
%put TNote: deptno = &deptno;
DATA STATSAS_3;
SET emp;
IF SAL >= &losal AND SAL <= &hisal AND DEPTNO = &deptno THEN OUTPUT;
RUN;
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 | 7844 | TURNER | SALESMAN | 7698 | 1981-09-08 | 1500 | 0 | 30 |
- Data step의 Macro 변수 할당 방식
SAS Programming |
%%SAS sas
DATA _NULL_;
SET salgrade;
CALL SYMPUT('losal_M',losal);
CALL SYMPUT('hisal_M',hisal);
WHERE grade=3;
RUN;
DATA _NULL_;
SET dept;
CALL SYMPUT('deptno_M',deptno);
WHERE dname='SALES';
RUN;
%put TNote: losal = &losal_M;
%put TNote: hisal = &hisal_M;
%put TNote: hisal = &deptno_M;
DATA STATSAS_3;
SET emp;
IF SAL >= &losal_M AND SAL <= &hisal_M AND DEPTNO = &deptno_M THEN OUTPUT;
RUN;
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 | 7844 | TURNER | SALESMAN | 7698 | 1981-09-08 | 1500 | 0 | 30 |
10. Python Dfply Package
Python Programming |
# [참고] 함수 사용. (52번 예제 참고)
@pipe
def pull_fun(df, column=-1):
return df.loc[:, column].item()
emp >> filter_by( X.sal >= ( salgrade >> filter_by(X.grade == 3) >> select(X.losal) >> pull_fun("losal") ) ,
X.sal <= ( salgrade >> filter_by(X.grade == 3) >> select(X.hisal) >> pull_fun("hisal") ) ,
X.deptno == ( dept >> filter_by(X.dname=='SALES') >> select(X.deptno) >> pull_fun("deptno") )
)
Results |
empno | ename | job | mgr | hiredate | sal | comm | deptno | |
1 | 7499 | ALLEN | SALESMAN | 7698.0 | 1981/02/20 | 1600 | 300.0 | 30 |
9 | 7844 | TURNER | SALESMAN | 7698.0 | 1981/09/08 | 1500 | 0.0 | 30 |
[SQL, Pandas, R Prog, Dplyr, SQLDF, PANDASQL, DATA.TABLE] SQL EMP 예제로 만나는 테이블 데이터 처리 방법 리스트
'통계프로그램 비교 시리즈 > 프로그래밍비교(Oracle,Python,R,SAS)' 카테고리의 다른 글
[문자 함수] 문자 길이 측정 - 87 (1) | 2022.09.26 |
---|---|
[데이터 전처리] 비상관 서브쿼리(Uncorrelated Subqueyr) 를 만족하는 데이터 추출 - 상하 결합 UNION 연산자 - 86 (0) | 2022.09.23 |
[데이터 전처리 비교- 테이블 결합] LEFT JOIN (왼쪽 결합) 으로 2개 테이블 결합 - 오른쪽 테이블에 미존재 데이터 추출 - 84 (0) | 2021.11.15 |
[데이터 전처리 비교- 데이터 추출] 비상관 서브쿼리를 만족하는 데이터 추출 - NOT IN 연산자 - 83 (0) | 2021.11.10 |
[데이터 전처리 비교- 데이터 추출] 비상관 서브쿼리를 만족하는 데이터 추출 - 중복 제거를 통한 유일한 값 추출 - IN 연산자 - 82 (0) | 2021.09.01 |
댓글