포스팅 목차
110. Display dname where at least 3 are working and display only dname.
* 부서내 직원 수가 4명 이상인 부서의 부서 정보를 출력하시오.
- 파이썬 & R 패키지 호출 및 예제 데이터 생성 링크
- [데이터 추출] 해당 그룹에 대한 특정 조건을 만족하는 그룹 리스트 출력
- 데이터 전처리 - SQL, Pandas, R Prog, Dplyr, Dfply, SQLDF, PANDASQL, DATA.TABLE, SAS, Proc Sql
|
1. Oracle(오라클)
서브쿼리에서 EMP테이블에서 부서별 직원의 수가 4명 이상인 부서를 선택 후 DEPT 테이블에서 해당 부서를 검색하여 부서별 직원수가 4명이 이상인 부서 정보를 출력한다.
Oracle Programming |
select dname,loc
from dept
where deptno in (select deptno from emp group by deptno having count(*)>3);
Oracle Programming |
select dname, loc
from dept A,
(select deptno from emp group by deptno having count(*)>3) B
where a.deptno = b.deptno
2. Python Pandas(파이썬)
EMP테이블에서 부서별 직원수가 4명 이상인 부서를 선택 후 DEPT 테이블에서 해당 부서 정보를 출력한다.
Python Programming |
dept[dept.deptno.isin(emp.groupby('deptno')['sal'].count().reset_index().query('sal > 3').deptno)]
Results |
deptno | dname | loc | |
1 | 20 | RESEARCH | DALLAS |
2 | 30 | SALES | CHICAGO |
EMP테이블에서 부서별 직원수가 4명 이상인 부서를 선택 후 DEPT 테이블과 내부조인(Inner join)을 수행하여 부서별 직원수가 4명 이상인 부서 정보를 출력한다.
Python Programming |
pd.merge( dept, (emp.groupby('deptno')['sal'].count().reset_index().query('sal > 3')),
how='inner', left_on=['deptno'], right_on=['deptno'])
Results |
deptno | dname | loc | sal | |
0 | 20 | RESEARCH | DALLAS | 5 |
1 | 30 | SALES | CHICAGO | 6 |
3. R Programming (R Package)
EMP테이블에서 부서별 직원수가 4명 이상인 부서를 선택 후 subset 함수를 지정하여 DEPT 테이블에서 해당 부서 정보를 출력한다.
R Programming |
%%R
subset( aggregate(sal~deptno, emp, length), sal>3 )
Results |
deptno sal
2 20 5
3 30 6
EMP테이블에서 부서별 직원수가 4명 이상인 부서를 선택 후 merge 연산자에 DEPT 테이블과 함께 지정하여 내부조인(Inner join)을 수행하여 부서별 직원수가 4명 이상인 부서 정보를 출력한다.
R Programming |
%%R
merge( dept,
(subset( aggregate(sal~deptno, emp, length),sal>3 )),
by.x=c("deptno"),by.y=c("deptno"),all.x=F)
Results |
deptno dname loc sal
1 20 RESEARCH DALLAS 5
2 30 SALES CHICAGO 6
4. R Dplyr Package
EMP테이블에서 부서별 직원수가 4명 이상인 부서를 선택 후 filter 함수를 지정하여 DEPT 테이블에서 해당 부서 정보를 출력한다.
R Programming |
%%R
dept %>%
dplyr::filter(deptno %in% ( emp%>%
dplyr::group_by(deptno) %>%
dplyr::tally() %>%
dplyr::filter(n >3) %>%
dplyr::select(deptno) %>%
dplyr::pull() ) )
Results |
# A tibble: 2 x 3
deptno dname loc
<dbl> <chr> <chr>
1 20 RESEARCH DALLAS
2 30 SALES CHICAGO
EMP테이블에서 부서별 직원수가 4명 이상인 부서를 선택 후 DEPT 테이블과 내부조인(Inner join)을 수행하여 부서별 직원수가 4명 이상인 부서 정보를 출력한다.
R Programming |
%%R
dept %>%
dplyr::inner_join( emp %>%
dplyr::group_by(deptno) %>%
dplyr::tally() %>%
dplyr::filter(n > 3) , by = c('deptno' = 'deptno') )
Results |
# A tibble: 2 x 4
deptno dname loc n
<dbl> <chr> <chr> <int>
1 20 RESEARCH DALLAS 5
2 30 SALES CHICAGO 6
5. R sqldf Package
서브쿼리에서 EMP테이블에서 부서별 직원의 수가 4명 이상인 부서를 선택 후 DEPT 테이블에서 해당 부서를 검색하여 부서별 직원수가 4명이 이상인 부서 정보를 출력한다.
R Programming |
%%R
sqldf(" select dname, loc
from dept
where deptno in (select deptno from emp group by deptno having count(*)>3);")
Results |
dname loc
1 RESEARCH DALLAS
2 SALES CHICAGO
EMP테이블에서 부서별 직원수가 4명 이상인 부서를 선택 후 DEPT 테이블과 내부조인(Inner join)을 수행하여 부서별 직원수가 4명 이상인 부서 정보를 출력한다.
R Programming |
%%R
sqldf("select dname, loc
from dept A,
(select deptno from emp group by deptno having count(*)>3) B
where a.deptno = b.deptno")
Results |
dname loc
1 RESEARCH DALLAS
2 SALES CHICAGO
6. Python pandasql Package
서브쿼리에서 EMP테이블에서 부서별 직원의 수가 4명 이상인 부서를 선택 후 DEPT 테이블에서 해당 부서를 검색하여 부서별 직원수가 4명이 이상인 부서 정보를 출력한다.
Python Programming |
ps.sqldf("select dname \
from dept \
where deptno in (select deptno from emp group by deptno having count(*)>3);")
Results |
dname | |
0 | RESEARCH |
1 | SALES |
Python Programming |
ps.sqldf("select dname \
from dept A, (select deptno from emp group by deptno having count(*)>3) B \
where a.deptno = b.deptno")
Results |
dname | |
0 | RESEARCH |
1 | SALES |
7. R data.table Package
EMP테이블에서 부서별 직원수가 4명 이상인 부서를 선택 후 DEPT 테이블과 내부조인(Inner join)을 수행하여 부서별 직원수가 4명 이상인 부서 정보를 출력한다.
R Programming |
%%R
DT <- data.table(emp)
dept_DT <- data.table(dept)
dept_DT[DT[, .N, by = .(deptno)][N > 3], nomatch=NULL, on=.(deptno=deptno),]
Results |
deptno dname loc N
1: 20 RESEARCH DALLAS 5
2: 30 SALES CHICAGO 6
EMP테이블에서 부서별 직원의 수가 4명 이상인 부서를 선택 후 DEPT 테이블에서 해당 부서를 검색하여 부서별 직원수가 4명이 이상인 부서 정보를 출력한다.
R Programming |
%%R
DT <- data.table(emp)
dept_DT <- data.table(dept)
salgrade_DT <- data.table(salgrade)
dept_DT[deptno %in% DT[, .N, by = .(deptno)][N > 3]$deptno,]
Results |
deptno dname loc
1: 20 RESEARCH DALLAS
2: 30 SALES CHICAGO
8. SAS Proc SQL
서브쿼리에서 EMP테이블에서 부서별 직원의 수가 4명 이상인 부서를 선택 후 DEPT 테이블에서 해당 부서를 검색하여 부서별 직원수가 4명이 이상인 부서 정보를 출력한다.
SAS Programming |
%%SAS sas
PROC SQL;
CREATE TABLE STATSAS_1 AS
select dname from dept
where deptno in (select deptno from emp group by deptno having count(*)>3);;
QUIT;
PROC PRINT;RUN;
Results |
OBS | dname |
1 | RESEARCH |
2 | SALES |
SAS Programming |
%%SAS sas
PROC SQL;
CREATE TABLE STATSAS_1 AS
select dname,
COUNT(*) AS EMP_CNT
from dept A, emp B
where a.deptno = b.deptno
GROUP
BY 1
HAVING COUNT(*) > 3;
QUIT;
PROC PRINT;RUN;
Results |
OBS | dname | EMP_CNT |
1 | RESEARCH | 5 |
2 | SALES | 6 |
9. SAS Data Step
SAS Programming |
%%SAS sas
PROC SORT DATA=dept OUT=dept_1;
BY deptno;
RUN;
PROC SUMMARY DATA=EMP NWAY;
CLASS DEPTNO;
VAR EMPNO;
OUTPUT OUT=EMP_1(DROP=_:) N=EMP_CNT;
RUN;
PROC SORT DATA=EMP_1;
BY DEPTNO;
RUN;
DATA STATSAS_2;
MERGE dept_1(IN=A) EMP_1(IN=B);
IF (A AND B) AND EMP_CNT > 3 THEN OUTPUT;
RUN;
PROC PRINT;RUN;
Results |
OBS | deptno | dname | loc | EMP_CNT |
1 | 20 | RESEARCH | DALLAS | 5 |
2 | 30 | SALES | CHICAGO | 6 |
10. Python Dfply Package
Python Programming |
# [참고] 함수 사용. (52번 예제 참고)
@dfpipe
def pull_fun(df, column=-1):
return df.loc[:, column].item()
dept >> \
filter_by( X.deptno.isin( emp >> group_by(X.deptno) >> summarize(emp_cnt = n(X.empno)) >> filter_by(X.emp_cnt > 3) >> select(X.deptno) >> pull_fun("deptno") ))
Results |
deptno | dname | loc | |
1 | 20 | RESEARCH | DALLAS |
2 | 30 | SALES | CHICAGO |
Python Programming |
dept >> \
inner_join( (emp >> group_by(X.deptno) >> summarize(emp_cnt = n(X.empno)) >> filter_by(X.emp_cnt > 3)) , by="deptno" )
Results |
deptno | dname | loc | emp_cnt | |
0 | 20 | RESEARCH | DALLAS | 5 |
1 | 30 | SALES | CHICAGO | 6 |
[SQL, Pandas, R Prog, Dplyr, SQLDF, PANDASQL, DATA.TABLE] SQL EMP 예제로 만나는 테이블 데이터 전처리 방법 리스트
'통계프로그램 비교 시리즈 > 프로그래밍비교(Oracle,Python,R,SAS)' 카테고리의 다른 글
[데이터 추출] 특정 조건을 만족하는 데이터 추출 - 상관 서브쿼리, 평균 - 112 (0) | 2022.12.07 |
---|---|
[데이터 추출] 특정 조건을 만족하는 데이터 추출 - 비상관 서브쿼리, 평균 - 111 (0) | 2022.12.06 |
[데이터 추출] 그룹 집계 후 특정 조건을 만족하는 그룹의 집계 통계량 출력 - 109 (0) | 2022.12.05 |
[데이터 추출] 최소값과 최대값 계산하기 - 108 (0) | 2022.12.05 |
[데이터 추출] 관측치 최대값(MAX) 리스트 추출 - 107 (0) | 2022.12.04 |
댓글